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本身处理会话。问题解决了。
我得到了这个问题几次,它非常讨厌。所以,让我描述可能的解决方案。
打开开发环境 - yourdomain.com/app_dev.php/尝试刷新页面几次。如果您每次看到会话ID都发生变化 - 这意味着会话中断。
如果您使用的是Chrome(如果没有 - 你应该,它的最好的开发者)) - 你可以打开开发者工具(点击F12)。 接下来,检查网络选项卡,刷新页面并找到您的主要请求。 检查您的请求标题 - 如果应该看到“Cookie:PHPSESSID”。
如果您没有看到 - Cookie出现问题。在我的情况下,它是
framework:
session:
cookie_domain: mydomain.com
刚刚安装了一些php模块后,又发现了这个bug(不知道是哪一个)。会话的文件夹不能写入nginx(由于某些原因,它没有指向/ tmp)。 – 2015-09-10 10:42:21
我在开发人员的工具栏中显示的id错了 - 这是调试令牌,而不是会话ID。所以,如果它在每个请求中都发生了变化,那么它确定 - 它并不意味着会话被破坏了(至少对于symfony 2.3。*来说) – 2017-01-18 19:46:13
请显示该行。这里缺少代码,并且不清楚发生的地方。 – hakre 2013-04-29 09:36:55
它基本上只是'session_start();'添加到./web/app.php文件。 – 2014-05-27 19:46:51
那么,这将启动所有请求的会话,这是不推荐的。它可能已经“解决”了你的问题,而不是开始会话,但是,它引入了许多你不想拥有的副作用。相反,找出*为什么会话没有启动(启用PHP错误日志记录,检查标题错误,例如,使用xdebug来查看会发生什么等),然后将其修复到需要修复的单个位置。 – hakre 2014-05-28 06:10:42