如何在app.psgi中获取有关自身的信息



拥有任何基于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,则该服务器正在侦听某个端口。如果您需要在应用程序本身之前了解该端口,则必须使用自定义中间件将其封装,然后才能对其执行操作。

相关内容

  • 没有找到相关文章

最新更新