Symfony 2 会话被销毁


Symfony 2 session destroyed

我在Symfony2会话中遇到了一个令人讨厌的问题。我有一个可以插入东西的购物车。我添加了几个项目并且可以工作,但是在某些项目上,应用程序崩溃告诉我 ContextErrorException: Warning: session_start(): Failed to decode session object. Session has been destroyed in ... 会话已销毁,我已注销站点。
我将会话存储在数据库中,并且有关会话的行也被删除,就像干净注销一样。我三重检查了所有代码,我没有使会话无效的代码。我还注释掉了包含session->invalidate的每一行,但无济于事。
我注意到会话清理发生在代码返回后一个函数的"返回"和代码中的下一行之间,但它们之间没有代码。这似乎与事件/侦听器有关,但没有一个是我配置的。
我不知道去哪里检查,有什么想法吗?

根据此报告和其他搜索,我的猜测是您在会话数据中存储了多字节字符串,并且它已损坏。存储数据的数据库列也可能太短,字符串被截断,从而损坏它。以下是我要看的:

  • 如果使用数据库进行存储,请确保它已为多字节字符串做好准备。
  • 确保您的会话数据库列足够大,例如 MEDIUMTEXT而不是VARCHAR.
  • 也许Symfony的会话处理程序中存在错误(不太可能,因为可能会很快被捕获)。
  • 也许您以某种方式损坏了自己的多字节字符串。检查您没有使用任何非二进制安全的 PHP 函数。

如果找不到根本原因,我会尝试覆盖会话存储处理程序,并在存储之前对数据运行base64_encode,并在检索后解码。 但这是解决真正问题的最后手段。

我更改了PDOSessionHandler的write e read方法,而不是base64encode/decode,我把utf8_encode用于写入,并在读取方法中放入utf8_decode。此解决方法对我有用,但不是一个干净的解决方案。 现在的问题是:为什么base64编码/解码失败?