【问题标题】:Symfony2 Failed to start the session: already started by PHPSymfony2 无法启动会话:已经由 PHP 启动
【发布时间】:2015-01-02 22:03:36
【问题描述】:

我遇到了一个非常奇怪的问题,如下所示:

[2014-11-06 11:21:13] request.INFO: Matched route "core_timetracking_new_user" (parameters: "_controller": "Bricks\Custom\CoreBundle\Controller\TimeTrackingController::newuserAction", "_route": "core_timetracking_new_user") [] []
[2014-11-06 11:21:13] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Failed to start the session: already started by PHP." at /var/cache/app/prod/classes.php line 113 {"exception":"[object] (RuntimeException: Failed to start the session: already started by PHP. at /var/cache/app/prod/classes.php:113)"} []

奇怪的是我没有启动会话或使用它,这是控制器代码:

/**
 * @View
 */
public function newuserAction()
{
    $trackingService=$this->get('core.timetracking_service');
    $user= new TimeTrackingUser();
    $request=$this->getRequest();

    $form = $this->createFormBuilder($user)
        ->add('name','text')
        ->add('email','text')
        ->add('pass','password')
        ->add('save', 'submit', array('label' => 'Erstellen'))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        $trackingService->persistUser($form->getData());
        return $this->redirect($this->generateUrl('core_timetracking_user_list'));
    }else {
        return array(
            'form' => $form->createView()
        );
    }
}

虽然这个动作很有效

/**
 * @View
 */
public function listuserAction()
{

    $request=$this->getRequest();
    $trackingService=$this->get('core.timetracking_service');    
    $users=$trackingService->getAllUsers();

    return array(
        'users' => $users
    );
}

所以唯一的区别是我使用了

$form->handleRequest($request); 

还检查了我的所有文件 AppKernel 等是否都以

两个动作(工作的一个和不工作的一个)都在同一个控制器中

【问题讨论】:

  • 您是否碰巧开启了“session.auto_start”配置选项? php.net/manual/en/…
  • 嗨@john Smith,会话是由 Symfony2 自动声明的,所以有可能,如果您使用 PHP 函数或其他方式再次手动启动会话,则可能会发生该问题,而您可以在 config.yml 文件中停止自动启动会话。
  • @Erik session.auto_start => Off => Off ,好像关闭了
  • 第二个动作在调用 $request=$this->getRequest(); 时也有效在那里,我只是没有得到错误,似乎涉及 $form->handleRequest

标签: php symfony session


【解决方案1】:

您应该检查是否有任何听众开始新会话。

您不能有一个带有new Session() 的侦听器。您应该像在操作方法中一样使用请求会话。


我有一个 onKernelController 监听器,它使用 new Session() 启动了一个新会话,然后当表单尝试生成 csrf 令牌时,它会检查会话是否存在并抛出异常。

【讨论】:

    【解决方案2】:

    一旦你呈现一个表单,Symfony 会自动启动一个会话来存储 CSRF 保护的令牌: http://symfony.com/doc/current/book/forms.html#csrf-protection

    您可以禁用 CSRF 保护,但默认情况下它处于开启状态。

    @rakete:
    我唯一的额外想法是更改会话文件的存储方式(例如文件系统、数据库、内存等)。见这里:http://symfony.com/doc/current/components/http_foundation/session_configuration.html

    【讨论】:

    • 除了禁用保护之外没有别的办法吗?我遇到了同样的问题并通过禁用它来解决它 - 但我认为这不是最好的解决方案......
    • 我猜 NO。 Symfony 需要将 CSRF 令牌保存在某处,而在两个请求中保存它的唯一方法是会话。为什么阻止会话启动对您来说如此重要?
    • @rakete 不幸的是它是前一段时间的,我不记得了,但可能是我们只是想知道并禁用令牌,现在当我读到这个时,我真的很想知道,因为我从来没有遇到过同样的问题之后的 symfony 项目
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2014-02-12
    • 2020-05-21
    • 2014-03-23
    相关资源
    最近更新 更多