有没有办法发现哪个服务器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
环境变量不是解决方案......
答案 0 :(得分:1)
简短回答,检查来电者:
#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;
但是,在app.psgi中执行此操作会降低您的代码的可移植性。如果您在未知服务器上死亡,人们将无法在未知位置运行您的代码。
另外,请注意,此代码可能会多次运行,具体取决于服务器的实现方式,因此可能会多次出现任何副作用。
例如,以下是plackup
的输出:
plackup --app /usr/lusers/bburnett/dev/trunk/getserver.psgi
Server: plackup
HTTP::Server::PSGI: Accepting connections at http://0:5000/
到目前为止一切顺利。但这是starman
的输出:
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
这里为主人和每个孩子运行一次(默认为四个孩子)。
如果你真的想要为这些不同的服务器发生不同的事情,那么更健壮的方法可能是自己对它们进行子类化,并将代码放入每个子类中,根据需要将-s My::Starman::Wrapper
传递给plackup和starman。
如果你真的想要一个switch语句并将代码放在一个地方,你可以考虑编写一些调用Plack :: Loader或Plack :: Runner的代码。看看plackup
的来源,你会看到它如何包装Plack :: Runner。看一下Plack :: Loader的源代码,您将看到它如何运行后端,然后加载相应的服务器类。