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 事件,因为在我的情况下不需要它。
我在 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 事件,因为在我的情况下不需要它。