해결책 아니다 검사, 발신자 답 만들 것 app.psgi에서이 일을
#app.psgi
# use Modern::Perl;
use feature qw(switch say);
use Carp qw(longmess);
use Plack::Builder;
my $app = sub {
return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello World' ] ];
};
# This hack gets what we need out of the call stack
my $stack = longmess("Stack:");
# say STDERR $stack;
given($stack) {
when (/plackup/) { say STDERR "Server: plackup" };
when (/Starman/) { say STDERR "Server: starman" };
default { die "Server: Unknown" };
}
return $app;
그러나 , 당신의 코드가 덜 휴대합니다. 알 수없는 서버에서 죽으면 사람들은 알 수없는 위치에서 코드를 실행할 수 없습니다.
또한이 코드는 서버 구현 방법에 따라 여러 번 실행될 수 있으므로 여러 가지 부작용이 여러 번 발생할 수 있습니다. 지금까지 너무 좋아
plackup --app /usr/lusers/bburnett/dev/trunk/getserver.psgi
Server: plackup
HTTP::Server::PSGI: Accepting connections at http://0:5000/
:
예를 들어, 여기 plackup
의 출력이다. 여기
starman --app /usr/lusers/bburnett/dev/trunk/getserver.psgi
2014/02/21-16:09:46 Starman::Server (type Net::Server::PreFork) starting! pid(27365)
Resolved [*]:5000 to [0.0.0.0]:5000, IPv4
Binding to TCP port 5000 on host 0.0.0.0 with IPv4
Setting gid to "15 15 0 0 15 20920 20921 20927"
Server: starman
Server: starman
Server: starman
Server: starman
Server: starman
는 마스터에 대해 한 번 실행하고 아이 당 한 번 (네 자녀 기본값) 도착 : 그러나 여기 starman
의 출력이다.
실제로 서로 다른 서버에서 발생하기를 원하는 경우보다 강력한 방법은 직접 서브 클래스를 만들고 코드를 -s My::Starman::Wrapper
으로 전달하여 필요에 따라 starman으로 전달하는 것입니다.
switch 문을 실제로 사용하고 코드를 한 곳에 넣으려면 Plack :: Loader 또는 Plack :: Runner를 호출하는 코드를 작성해야합니다. plackup
의 출처를 살펴보면 Plack :: Runner가 어떻게 감싸는 지 알 수 있습니다. Plack :: Loader의 소스를 살펴보면 백엔드 실행 방법을 알 수 있으며 적절한 서버 클래스를로드합니다.