6

我遇到了会话突然被破坏的问题:

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

有点不可能复制这个问题,因为我在我的服务器日志中抛出了这个问题。

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

4

4 回答 4

6

当我在 $_SESSION 中存储太多时,这发生在我身上,它们是在表中使用 serialize() 保存的。解决方法:不要储存太多。

于 2017-07-11T01:42:31.313 回答
3

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

我所做的是utf8mb4使用 collat​​ion更新到字符集utf8mb4_unicode_ci

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

本指南可能会有所帮助 >

于 2018-03-21T20:48:47.477 回答
2

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

所以问题是一个或两个:

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

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

于 2020-04-06T12:02:01.310 回答
1

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

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

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

$_SESSION['username'] = (string)$username;
于 2020-03-03T12:57:51.507 回答