拥有任何基于PSGI的应用程序,例如以下app.psgi
片段
use 5.016;
use warnings;
use Data::Dumper;
#WHAT TO DO HERE to get the $port?
my $port = $ENV{SERVER_PORT} // "undefined";
print STDERR "my port is: $portn"; #says "undefined"
my $app = sub {
my $env = shift;
printf STDERR "Port from the app is: $env->{SERVER_PORT}n";
return [
200,
['Content-Type' => 'text/plain'],
[ "hello world!"],
];
};
$app;
如何发现有关正在运行的服务器的一些信息?例如,当以的形式运行app.psgi
时
plackup -p 6000
将设置&打印$port
-6000。
在$app
内部很容易,因为我可以访问$env
。但是我想在调用$app
之前得到$port
,例如,上面的例子在每次请求时都打印端口,但我想在$app
开始运行之前得到一次$port
。
编辑
是的,我必须知道,例如,服务器可以监听更多的端口,并且当请求到达某些端口时,会定义确切的端口。
我想获取侦听端口。
但根据评论和答案,这里可能没有任何统一的API到不同的服务器实现(Starman,Twiggy)来获得监听端口
这个问题背后的真正原因是我想向Bonjour(Zeroconf)发布应用程序。(我还不知道怎么做,但有必要知道应用程序在哪个端口上侦听。)
现在我也意识到,将plackup
命令本身包装成一些代码会容易得多,例如runserver.pl
-并且会知道我将使用什么来运行plackup
命令的端口。)
在当前的PSGI规范中,没有API可以实现这一点。正如已经指出的,侦听端口可以是多个端口,甚至是unix套接字。该应用程序不需要也不应该知道运行环境。
对于您的实际动机,这是通过bonjour:宣传绑定地址/端口
a) 您可以编写引导脚本,然后使用Plack::Runner模块运行plackup核心。事实上,这正是App::HTTPThis所做的(它也做了一些有益的事情)https://metacpan.org/release/App-HTTPThis
b) Plack::Runner和一些PSGI处理程序支持server_ready
钩子,但遗憾的是,这些处理程序没有得到很好的文档记录,这允许您在启动时传递代码引用以获取绑定主机和端口。
就像@Borodin已经指出的那样,在$app
-coderef之外没有端口。但是,如果您使用符合PSGI的服务器运行$app
,则该服务器正在侦听某个端口。如果您需要在应用程序本身之前了解该端口,则必须使用自定义中间件将其封装,然后才能对其执行操作。