2014-01-19 13 views
2

app.psgi이 (가) 실행중인 서버를 확인하는 방법이 있습니까?app.psgi 프로세스가 실행중인 서버를 어떻게 발견합니까?

예를 들어, 내가 app.psgi에서 다음의 코드를 해결하는 방법에 대한 몇 가지 아이디어를 찾고 있어요 :

#app.psgi 
use Modern::Perl; 
use Plack::Builder; 
my $app = sub { ... }; 

my $server = MyApp::GetServerType(); # <--- I need some idea for how to write this... 

given($server) { 
    when (/plackup/) { ... do something ... }; 
    when (/Starman/) { ... do something other ... }; 
    default { die "Unknown" }; 
} 

$app; 

PLACK_ENV 환경 변수를 확인하는 것은 ... 짧은

답변

1

해결책 아니다 검사, 발신자 답 만들 것 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의 소스를 살펴보면 백엔드 실행 방법을 알 수 있으며 적절한 서버 클래스를로드합니다.