headers 发送给客户端后,如何在 Symfony2 中处理 Session?

How to handle Session in Symfony2 after headers have been sent to client?

我在 Symfony2 控制器中有一个操作正在向客户端发送回响应(详述 here). After the function sends out the response, I have an event subscriber that listens for onkernelTerminate event 因为在将响应发送到客户端后我将做一些繁重的工作。

除了代码中有一行引用利用 Session 的服务外,对于执行繁重工作的部分来说,一切似乎都在正常工作,它需要它来存储令牌并最终与外部 API。

错误当然是:启动session失败,因为headers已经发送。

即使 headers 已发送,有没有办法启动 Session?或者有什么更好的方法来处理这个问题?

我最终通过从传入请求中获取 session 并将其存储到我的动作控制器中的局部变量来解决此问题,然后确保 session 已激活或启动:

use Symfony\Component\HttpFoundation\Request;

public function myFunctionAction(Request $request) {
   $session = $request->getSession();
   $session->start();

接下来,我立即将响应和headers发送给客户端:

    ob_start();
    $response = new Response('Status: OK', 200);
    echo $response; // send the response
    header('Connection: close');
    header('Content-Length: ' . ob_get_length());
    ob_end_flush();
    if (ob_get_level() > 0) {
        ob_flush();
    }
    flush();

然后代码像往常一样继续做繁重的工作。然而,解决此问题的关键是确保使用 Session 的服务向将要引用它的其他人提供在服务中保存或不保存 session 的选项。如果 session 被保存,那么它将不再激活并被关闭,并且一旦它被关闭你就不能再次启动它,因为 headers 已经被发送了。然而,引用该服务的客户端代码应该在课程结束时保存并关闭 session。

我最终没有监听 kernel.terminate 事件,因为在我的情况下不需要它。