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
ただし、ページをすばやく更新すると、期待どおりに値が増加することがあります。その場合、スターマンは同じフォークにとどまると思います。
この質問が以前にスタックオーバーフローで尋ねられたことがないことに驚いています。持続変数は私にとっては便利なように思えます。
助けてくれてありがとう。