与perl Dancer / plack / Starman和多名工作人员一起使用会话

时间:2015-03-07 22:33:55

标签: perl session dancer plack starman

我正在使用Starman通过plack运行perl Dancer应用程序(希望这是正确描述的东西),而且大多数情况下这是一种无痛的体验。我最近一直试图让会话工作(真的简单的东西 - 我只想存储几个字符串,我正在使用会话:"简单")在与多个工作人员一起运行Starman时,我遇到了一些非常奇怪的问题。

使用以下非常简单的代码(位于底部)会产生以下结果:

独立应用: 工作正常 - 单击它时计数器会递增。

Starman - 1名工人: 工作正常

Starman - 2名以上的工人: 会话似乎存在大约1秒钟,随后被销毁 - 计数器总是"到期"经过很短的一段时间。它似乎不是一个特定于工作人员的会话,它只是重置为空。如果你每秒敲击链接超过一次,它会永远增加(或者只要我可以打扰测试它)。

我做错了什么,或者这不起作用?它并不是非常关键,但能够让简单的会话工作会很棒。

谢谢,

戴夫

##
## Code to reproduce via:
## plackup -D -E env -s Starman --workers=3 -p 3000 -a myapp.pl
##

get '/sessiontest' => sub {
    return(&sessiontest());
};

sub sessiontest {
  my $testcounter = session 'testcounter' || 0;
  $testcounter++;
  session 'testcounter' => $testcounter;
  info "SESSION COUNTER($testcounter)";
  my $return = <<EOF;
<html>
<body>
<a href=\"/sessiontest\">$testcounter</a>
</body>
</html>
EOF
  return($return);
}

2 个答案:

答案 0 :(得分:1)

docs说:

  

这个模块实现了一个非常简单的会话后端,包含所有内容   会话数据在内存中。这意味着会话是易变的,没有   进程退出时存在的时间更长。这个模块可能是最多的   用于测试目的。

我认为两个不同的工作人员不会共享会话信息,因为他们都有自己的内存副本。

修改

似乎我对锤击过于热情。当我在请求之间做出更大的停顿时,会话信息确实消失了。

答案 1 :(得分:0)

有趣的是,我只是使用会话重新测试:&#34; YAML&#34;看起来它工作正常 - 它只是简单似乎有问题。我将暂时继续使用它,但如果有人有任何见解,我仍然会很乐意收到答案。

戴夫