2

拥有任何基于 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: $port\n"; #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. 但我想在调用$port 之前$app得到,例如上面的例子在每个请求时打印端口 - 但我想在开始运行$port之前得到一次。$app

编辑

是的,我必须知道例如服务器可以侦听更多端口,并且在请求到达某些端口时定义了确切的端口。

我想获得监听端口。

但是根据评论和回答,这里可能没有针对不同服务器实现(Starman、Twiggy)的任何统一 API 来获取监听端口。

问题背后的真正原因是我想向 Bonjour (Zeroconf) 宣传这些应用程序。(我还不知道如何(还),但有必要知道应用程序正在侦听哪个端口。)

现在我也意识到,将命令本身包装到一些代码中会更容易plackup,例如runserver.pl- 并且会知道我将用来运行plackup命令的端口。;)

4

2 回答 2

4

根据设计,在当前的 PSGI 规范中没有 API 可以实现这一点。正如已经指出的,监听端口可以是多个端口,甚至是 unix 套接字。该应用程序不需要也不应该需要知道运行环境。

对于您的实际动机,即通过 bonjour 宣传绑定地址/端口:

a) 您可以编写启动脚本,然后使用 Plack::Runner 模块运行 plackup 内核。实际上,这正是 App::HTTPThis 所做的(它也有 bonjour 位)https://metacpan.org/release/App-HTTPThis

b) server_readyPlack::Runner 和一些 PSGI 处理程序支持钩子,遗憾的是没有很好地记录,它允许您传递代码引用以在启动时获取绑定主机和端口。

于 2015-03-28T11:27:23.410 回答
0

就像@Borodin 已经指出的那样,-coderef 之外没有端口$app。但是,如果您$app使用某些符合 PSGI 的服务器运行,则该服务器正在侦听某个端口。如果你需要在应用程序本身之前知道这个端口,你必须用你的自定义中间件包装它,然后你可以用它做一些事情。

于 2015-03-27T22:02:36.687 回答