3

Starman で実行する場合、Dancer アプリでパッケージ変数 (またはそのようなもの) を使用する方法がわかりません。Starman の prefork に何らかの形で関連していると思いますが、それはバグではなく機能であるはずです。

Dancer アプリの例を次に示します。

package nafig;
use Dancer;

my $a = 0;
$b = 0;
$nafig::c = 0;

any '/' => sub {
    warn join " ", $a++, $b++, $nafig::c++;
};

start;

次に、そのアプリを 3 回連続して呼び出します。まず、plack 参照サーバーで実行すると、すべてが期待どおりに機能します。

$ plackup app.pl
HTTP::Server::PSGI: Accepting connections at http://0:5000/
0 0 0 at ... blah-blah-blah
1 1 1 at ... blah-blah-blah
2 2 2 at ... blah-blah-blah

しかし、Starman で同じことを行うと、次の結果が得られます。

$ plackup -s Starman app.pl
2013/11/17-23:33:35 Starman::Server (type Net::Server::PreFork) starting! pid(527)
Resolved [*]:5000 to [::]:5000, IPv6
Not including resolved host [0.0.0.0] IPv4 because it will be handled by [::] IPv6
Binding to TCP port 5000 on host :: with IPv6
Setting gid to "1000 1000 20 24 25 29 30 44 46 108 109 115 121 1000"
Starman: Accepting connections at http://*:5000/
0 0 0 at ... blah-blah-blah
0 0 0 at ... blah-blah-blah
0 0 0 at ... blah-blah-blah

ただし、ページをすばやく更新すると、期待どおりに値が増加することがあります。その場合、スターマンは同じフォークにとどまると思います。

この質問が以前にスタックオーバーフローで尋ねられたことがないことに驚いています。持続変数は私にとっては便利なように思えます。

助けてくれてありがとう。

4

1 に答える 1