Symfony2没有正确保存会话

时间:2012-07-24 21:01:07

标签: php session symfony

我遇到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个保持会话。但是,在第三个请求中,它已被清除。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

打开开发环境 - yourdomain.com/app_dev.php/尝试刷新页面几次。如果您每次都看到会话ID已更改 - 则表示会话已损坏。

Session id

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

如果你没有看到 - 饼干有问题。就我而言,它是

framework:
    session:         
        cookie_domain: mydomain.com