perl - perl有一种方法可以将包/全局变量与舞者和 Starman?

  显示原文与译文双语对照的内容

在运行Starman时,我无法找到在舞蹈应用程序中使用包变量( 或者任何一种)的方法。 我想它与starman的preforking相关,但这应该是一个特性,而不是 Bug 。

下面是一个舞者应用示例:


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在那些情况下仍然处于同一个 fork 中。

我很惊讶这个问题以前从未在stackoverflow上提过。 持久变量对我来说是有用的,人们如何在没有?

感谢你的帮助。

时间: 原作者:

你将需要一个像 Cache::Memcached 插件这样的模块,它允许你在fork线程上存储状态。

类似这样的东西( 未经测试)


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 。

原作者:
...