会话在PHP中无处不在

时间:2016-01-22 10:50:24

标签: php session cakephp cakephp-3.1

我遇到的问题是会话被无处摧毁:

session_start(): Failed to decode session object. Session has been destroyed

因为我在服务器日志中抛出了这个问题,所以无法复制该问题。

任何想法可能是该问题的根源和/或从哪里开始,因为我变得非常罕见(几乎从未)。

4 个答案:

答案 0 :(得分:4)

当我在$ _SESSION中存储太多而在表中使用serialize()保存它们时发生了这种情况。解决方案:不要存储太多。

答案 1 :(得分:2)

我也有这个问题,我发现问题是当有人发布表情符号时。我当前的服务器设置无法处理这四个字节的符号,导致“无法解码会话对象。会话已被破坏”。

我所做的是使用归类utf8mb4更新为字符集utf8mb4_unicode_ci

为了使其工作,您需要对数据库,数据库表和表列进行此更改。此外,在应用程序代码中,将连接字符集设置为utf8mb4

This guide might help >

答案 2 :(得分:0)

以防万一其他答案对您没有帮助... 这是我最近在开发过程中发生的。在我的环境中,我使用会话对象将会话保存在PostgreSQL数据库中。 我使用一个对象(自定义类型)来设置导致该错误的会话变量。我正在这样做

$username = new Name($httpRequest->username);
$_SESSION['username'] = $username;

原来是因为我正在使用自定义数据类型设置会话变量。通过执行以下操作,将其类型转换为基本类型(字符串),错误消失了。

$_SESSION['username'] = (string)$username;

答案 3 :(得分:0)

因此,在从Lighttpd Web服务器(PHP 5.6)迁移到Nginx Web服务器(PHP 7.2)之后,我遇到了这种情况,起初它是如此随机,但是,我注意到这个问题是特定于用户的,其中一些用户能够正常登录,但是服务器无法从会话中提供数据,因此我通过使用以下命令检查了自定义会话类中的read函数并检查了它试图serialize()返回的数据unset()我删除了我认为对于应用程序在serialize()之前运行并返回并有用的所有内容,这些内容似乎可以解决问题。

所以问题是一个或两个:

  • @Luke Wenke建议的数据太多
  • 无法按照@Carl建议处理的数据

有关read函数的更多信息:https://www.php.net/manual/en/function.session-set-save-handler.php