Symfony2没有正确保存会话

问题描述:

我遇到了Symfony在每个页面加载时创建新会话的问题,而不是跨请求传输数据。 config.yml中session部分的auto_start被设置为false,并且正常的php会话正常工作。只有在symfony中运行时,我才会遇到问题。Symfony2没有正确保存会话

例如,我创建的测试动作:

public function sessionTestAction() 
{ 

    $s_Response = '<html><head></head><body><p>Foo</p></body></html>'; //Initialize response and headers 
    $a_Headers = array(); 
    $i_StatusCode = 200; 


    $oSession = $this->get('session'); 
    var_dump($oSession->all()); 

    if(!$oSession->has('Test')) 
    { 
     $oSession->set('Test', 'Bar'); 
    } 

    $oSession->save(); 
    return new Response($s_Response, $i_StatusCode, $a_Headers); 
} 

的预期作用是,在第一个页面加载,后续代码var_dump将产生什么,并且在任何后续执行,它将包含测试= >酒吧。但是,它从来没有通过请求获取数据。

此外,它为每个请求创建一个新的会话ID。

我使用的Symfony v2.0.15,和PHP V5.4

人有什么想法?

编辑:

我想我已经取得了一些进展。我做了如下修改测试动作:

public function sessionTestAction() 
{ 

    //Initialize response and headers 
    $oRequest = $this->get('request'); 
    $a_Headers = array(); 
    if (isset($oRequest->headers->all()['cookie'])) 
    { 
     $a_Headers['Set-Cookie'] = $oRequest->headers->all()['cookie']; 
    } 
    $i_StatusCode = 200; 


    $oSession = $oRequest->getSession(); 
    $oSession->start(); 
    $s_Response = print_r($oSession->all(), true); 
    if(!$oSession->has('Test')) 
    { 
     $oSession->set('Test', 'Bar'); 
    } 

    $oSession->save(); 
    $oResponse = new Response($s_Response, $i_StatusCode, $a_Headers); 
    return $this->render('Bundle:Default:index.html.twig', array('response' => $s_Response), $oResponse); 
} 

如果这一树枝文件刚刚{{响应|原料}}。它现在持有3个请求中的2个会话。但是,在第三个请求中,它已被清除。

原来问题是,有人在app.php运行时添加了一行来设置会话cookie,但我不知道symfony本身处理会话。问题解决了。

+1

请显示该行。这里缺少代码,并且不清楚发生的地方。 – hakre 2013-04-29 09:36:55

+0

它基本上只是'session_start();'添加到./web/app.php文件。 – 2014-05-27 19:46:51

+0

那么,这将启动所有请求的会话,这是不推荐的。它可能已经“解决”了你的问题,而不是开始会话,但是,它引入了许多你不想拥有的副作用。相反,找出*为什么会话没有启动(启用PHP错误日志记录,检查标题错误,例如,使用xdebug来查看会发生什么等),然后将其修复到需要修复的单个位置。 – hakre 2014-05-28 06:10:42

我得到了这个问题几次,它非常讨厌。所以,让我描述可能的解决方案。

打开开发环境 - yourdomain.com/app_dev.php/尝试刷新页面几次。如果您每次看到会话ID都发生变化 - 这意味着会话中断。

Session id

如果您使用的是Chrome(如果没有 - 你应该,它的最好的开发者)) - 你可以打开开发者工具(点击F12)。 接下来,检查网络选项卡,刷新页面并找到您的主要请求。 检查您的请求标题 - 如果应该看到“Cookie:PHPSESSID”。 enter image description here

如果您没有看到 - Cookie出现问题。在我的情况下,它是

framework: 
    session:   
     cookie_domain: mydomain.com 
+0

刚刚安装了一些php模块后,又发现了这个bug(不知道是哪一个)。会话的文件夹不能写入nginx(由于某些原因,它没有指向/ tmp)。 – 2015-09-10 10:42:21

+0

我在开发人员的工具栏中显示的id错了 - 这是调试令牌,而不是会话ID。所以,如果它在每个请求中都发生了变化,那么它确定 - 它并不意味着会话被破坏了(至少对于symfony 2.3。*来说) – 2017-01-18 19:46:13