【问题标题】:Symfony2 not saving sessions properlySymfony2 没有正确保存会话
【发布时间】:2012-07-23 06:22:12
【问题描述】:

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=>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);
}

那个树枝文件只有 {{response|raw}}。它现在为 3 个请求中的 2 个保留会话。但是,在第三次请求时,它被清除了。

【问题讨论】:

    标签: php session symfony


    【解决方案1】:

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

    【讨论】:

    • 请显示该行。这里缺少代码,不清楚发生在哪里。
    • 基本上只是将session_start();添加到./web/app.php文件中。
    • 好吧,这将为所有不推荐的请求启动一个会话。它可能已经“解决”了您无法开始会话的问题,但是,它引入了许多您不想拥有的副作用。而是找出 为什么 会话没有启动(启用 PHP 错误日志记录,例如检查标头错误,使用 xdebug 来查看发生了什么等),然后在需要的地方修复它修复。
    • @hakre 我可能应该澄清一下,我是来尝试修复其他人(没有 symfony 经验)破坏的应用程序。是他们将那行添加到 app.php 文件中,试图修复某些问题,结果却让事情变得更糟。
    • 我会说这是值得评论的,因为未来的用户有更多的上下文,然后看看该解决方案是否适用于他们。
    【解决方案2】:

    我遇到过几次这个问题,非常烦人。所以,让我描述一下可能的解决方案。

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

    如果您使用的是 chrome(如果不是 - 您应该这样做,它对开发人员来说是最好的;)) - 您可以打开开发人员工具(单击 F12)。 接下来,检查网络选项卡,刷新页面并找到您的主要请求。 检查您的请求的标头 - 如果应该看到“Cookie:PHPSESSID”。

    如果您没有看到 - cookie 有问题。在我的情况下是

    framework:
        session:         
            cookie_domain: mydomain.com
    

    【讨论】:

    • 在我安装了一些 php 模块(不确定到底是哪一个)之后,又遇到了这个错误。会话的文件夹对于 nginx 是不可写的(由于某些原因它没有指向 /tmp)。
    • 我对开发人员工具栏中显示的 id 有误 - 那是调试令牌,而不是会话 id。所以,如果它在每个请求上都改变了就可以了——这并不意味着会话被破坏了(至少对于 symfony 2.3.*)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多