2016-11-28 55 views
0

我无法解释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(); 

    [...] 
} 
+0

如何交流中心!也许是比赛条件?执行的确切流程在哪里?你能发布处理会话的代码吗? – dbardelas

+0

@dbardelas我不知道。竞争条件应该在php会话被锁定时处理(Symfony PdoSessionHandler使用事务在数据库级别发出真正的行锁)。 controlAction控制器每秒执行一次,直到“结束”,然后,只有这样,当用户单击一个按钮后,另一个代码才会被执行一次,中间不会再次写入该用户的会话。即使没有锁,在这种“乐观的方式”ends_at“应该”不会被覆盖或清除。 https://github.com/symfony/http-foundation/blob/master/Session/Storage/Handler/PdoSessionHandler.php – aabilio

回答

0

正如我所说的,我看到一个GET请求获取正好在同一时间controlActionends_at设置。

如果在这个GET请求发生在同一时间我得到$session和“保存”它似乎解决了错误。

public function aSimpleController (Request $request) { 
    $session = $request->getSession(); 
    $session->save(); 

    [...] 
} 

根据该文件,$session->save()"force the session to be saved and closed"

相关问题