我遇到Symfony在每个页面加载时创建新会话的问题,而不是跨请求传送数据。 config.yml中session会话部分的auto_start设置为false,常规php会话工作正常。只有在symfony中运行才能解决问题。
例如,我创建了测试操作:
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将不产生任何内容,并且在任何后续执行中,它将包含Test =&gt; Bar。但是,它永远不会跨请求获取数据。
此外,它还为每个请求创建一个新的会话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);
}
该twig文件只有{{response | raw}}。它现在为3个请求中的2个保持会话。但是,在第三个请求中,它已被清除。
答案 0 :(得分:2)
原来问题是,有人在app.php运行时添加了一行来设置会话cookie,我不知道symfony会自己处理会话。问题解决了。
答案 1 :(得分:2)
我有几次这个问题,非常讨厌。所以,让我来描述可能的解决方案。
打开开发环境 - yourdomain.com/app_dev.php/尝试刷新页面几次。如果您每次都看到会话ID已更改 - 则表示会话已损坏。
如果你正在使用chrome(如果没有 - 你应该,它最适合开发人员;)) - 你可以打开开发人员工具(点击F12)。 接下来,检查网络选项卡,刷新页面并找到您的主要请求。 检查您的请求的标头 - 如果应该看到“Cookie:PHPSESSID”。
如果你没有看到 - 饼干有问题。就我而言,它是
framework:
session:
cookie_domain: mydomain.com