首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何发现在哪个服务器上运行app.psgi进程?

如何发现在哪个服务器上运行app.psgi进程?
EN

Stack Overflow用户
提问于 2014-01-19 11:33:13
回答 1查看 284关注 0票数 2

有没有一种方法可以发现在哪个服务器上运行app.psgi

例如,我正在寻找一些关于如何解决来自app.psgi的下一个代码片段的想法:

代码语言:javascript
复制
#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环境变量不是解决方案.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-22 00:25:22

简短的回答,检查来电者:

代码语言:javascript
复制
#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的输出

代码语言:javascript
复制
plackup --app /usr/lusers/bburnett/dev/trunk/getserver.psgi
Server: plackup
HTTP::Server::PSGI: Accepting connections at http://0:5000/

到目前一切尚好。但是下面是starman的输出

代码语言:javascript
复制
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以打包和导航。

如果您真的想要一个switch语句并将代码放在一个地方,您可以考虑编写一些调用Plack::Loader或Plack::Runner的代码。看看plackup的源代码,您将看到它是如何包装Plack::Runner的。查看Plack::Loader的源代码,您将看到它如何使后端运行,然后加载适当的服务器类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21216182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档