在用Starman运行时,我无法弄清楚使用舞台应用程序中的包变量(或其他类型的任何类型)。我想它是一个与starman的preforking有关,但这应该是一个特征,而不是一个错误。

这是舞者应用程序:

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
. 但是,当快速刷新页面时,有时值会按预期递增。我猜,Starman在这些案件中仍然存在于同一个叉子中。

我很惊讶这个问题从未在stackoverflow之前询问过。持久变量对我来说很有用,人们没有他们跳舞?

提前感谢任何帮助。

有帮助吗?

解决方案

您需要一个像 cache :: memcached ,允许您存储状态超过叉线程。

这样的东西(未经测试)

use strict;
use warnings;

package nafig; #this should start with a capital letter
use Dancer;
use Cache::Memcached;

my $cache =  new Cache::Memcached {
    'servers' => ['127.0.0.1:11211'],
    'compress_threshold' => 10_000,
};

$cache->set("var1", 0);

any '/' => sub {

    my $value = $cache->get("var1");

    warn join " ", $value++;

    $cache->set("var1", $value);
};

start;
.

从这里改编 http://perl.postbit.com/ how-to -use-memcached-with-perl.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top