我无法解释Symfony2会话有一个奇怪的错误。有时候有些变量没有定义。未在控制器上定义的Symfony2会话变量
我有一个控制器的方法是这样的:
public function controlAction (Request $request) {
$now = new \DateTime();
$session = $request->getSession();
$start = $request->get("start", "no");
$end = $request->get("end" , "no");
if ($start === "ok") {
$this->logger->info("[START]");
$session->set("sum", 0);
$session->set("starts_at", $now);
} elseif ($end === "ok") {
$this->logger->info("[END]");
$tmp = $session->get("sum", 0);
$session->set("sum", ++$tmp);
$session->set("ends_at", $now);
} else {
$this->logger->info("[OTHER]");
$tmp = $session->get("sum", 0);
$session->set("sum", ++$tmp);
}
// Checking:
$s = $session->get("starts_at", null);
$e = $session->get("ends_at", null);
$this->logger->info("ON SESSION [starts_at] -> " . ((isset($s) ? $s->format('r') : '--')));
$this->logger->info("ON SESSION [ends_at] -> " . ((isset($e) ? $e->format('r') : '--')));
$this->logger->info("ON SESSION [sum] -> " . $session->get("sum", null));
return new JsonResponse(array("code" => "ok"), Codes::HTTP_OK);
}
然后在另一种方法:
$startsAt = $session->get("starts_at", null);
$endsAt = $session->get("ends_at", null);
$this->logger->info("-- [starts_at] -> " . ((isset($startsAt) ? $startsAt->format('r') : '--')));
$this->logger->info("-- [ends_at] -> " . ((isset($endsAt) ? $endsAt->format('r') : '--')));
并在日志中我得到这个:
[2016-11-28 10:20:40] app.INFO: [START] [] []
[2016-11-28 10:20:40] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:40] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:40] app.INFO: ON SESSION [sum] -> 0 [] []
[2016-11-28 10:20:41] app.INFO: [OTHER] [] []
[2016-11-28 10:20:41] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:41] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:41] app.INFO: ON SESSION [sum] -> 1 [] []
[2016-11-28 10:20:42] app.INFO: [OTHER] [] []
[2016-11-28 10:20:42] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:42] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:42] app.INFO: ON SESSION [sum] -> 2 [] []
[2016-11-28 10:20:43] app.INFO: [OTHER] [] []
[2016-11-28 10:20:43] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:43] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:43] app.INFO: ON SESSION [sum] -> 3 [] []
[2016-11-28 10:20:44] app.INFO: [OTHER] [] []
[2016-11-28 10:20:44] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:44] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:44] app.INFO: ON SESSION [sum] -> 4 [] []
[2016-11-28 10:20:45] app.INFO: [OTHER] [] []
[2016-11-28 10:20:45] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:45] app.INFO: ON SESSION [ends_at] -> -- [] []
[2016-11-28 10:20:45] app.INFO: ON SESSION [sum] -> 5 [] []
[2016-11-28 10:20:46] app.INFO: [END] [] []
[2016-11-28 10:20:46] app.INFO: ON SESSION [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:46] app.INFO: ON SESSION [ends_at] -> Mon, 28 Nov 2016 10:20:46 +0100 [] []
[2016-11-28 10:20:46] app.INFO: ON SESSION [sum] -> 5 [] []
[2016-11-28 10:20:52] app.INFO: -- [starts_at] -> Mon, 28 Nov 2016 10:20:40 +0100 [] []
[2016-11-28 10:20:52] app.INFO: -- [ends_at] -> -- [] []
在结束,ends_at var(请求后6秒)未定义。但现在是这种执行,有时是starts_at var是未定义的那个。
我迷路了。有人可以点亮一些光线吗?
编辑添加更多的信息:
一些测试后,我看到了一个GET请求获取正好在同一时间controlAction时ends_at设置,并延迟第二此请求的错误出现待解决。但在该请求不使用会话对象的控制器......
编辑2:更多信息
如果在此GET请求发生在同一时间,最后调用controlAction我获得$会话和“保存”,它似乎解决了错误太:
public function aSimpleController (Request $request) {
$session = $request->getSession();
$session->save();
[...]
}
如何交流中心!也许是比赛条件?执行的确切流程在哪里?你能发布处理会话的代码吗? – dbardelas
@dbardelas我不知道。竞争条件应该在php会话被锁定时处理(Symfony PdoSessionHandler使用事务在数据库级别发出真正的行锁)。 controlAction控制器每秒执行一次,直到“结束”,然后,只有这样,当用户单击一个按钮后,另一个代码才会被执行一次,中间不会再次写入该用户的会话。即使没有锁,在这种“乐观的方式”ends_at“应该”不会被覆盖或清除。 https://github.com/symfony/http-foundation/blob/master/Session/Storage/Handler/PdoSessionHandler.php – aabilio