会话在 PHP 中突然被破坏
Posted
技术标签:
【中文标题】会话在 PHP 中突然被破坏【英文标题】:Session destroyed out of nowhere in PHP 【发布时间】:2016-04-28 22:42:37 【问题描述】:我遇到了会话突然被破坏的问题:
session_start(): Failed to decode session object. Session has been destroyed
.
有点不可能复制这个问题,因为我在我的服务器日志中遇到了这个问题。
任何想法可能是该问题的根源和/或从哪里开始,因为我得到了非常罕见的(几乎从来没有)。
【问题讨论】:
请查看此链接:-***.com/questions/8549757/… 现在同样的问题。我们将会话保存在数据库中。它出现在我将自定义创建的 PDO 对象更改为来自 Eloquent/Capsule 的对象之后。还是不知道,这两个 PDO-Object 有什么区别。 处理 unicode 时在我的应用程序中弹出此问题。自定义会话处理程序不正确地写入数据库并且无法取回它。 只检查是否使用数据库存储进行会话检查列的数据类型和长度 如果某些 Unicode 字符和存储在数据库中的会话出现此问题,请确保数据确实以二进制形式存储,而不是作为字符数据。如果您无法更改列类型,base64 编码/解码可能会有所帮助。 php issue #71088 可能与 PostgreSQL 用户相关。 【参考方案1】:当我在 $_SESSION 中存储太多时,这发生在我身上,它们是在表中使用 serialize() 保存的。解决方法:不要储存太多。
【讨论】:
【参考方案2】:我也遇到了这个问题,我发现问题出在有人发布表情符号时。我当前的服务器设置无法处理这四个字节符号,导致“无法解码会话对象。会话已被破坏”。
我所做的是使用排序规则 utf8mb4_unicode_ci
更新到字符集 utf8mb4
。
为了使其工作,您需要对数据库、数据库表和表列进行此更改。此外,在您的应用程序代码中,将连接字符集设置为 utf8mb4
。
This guide might help >
【讨论】:
我有一个类似的问题,我不小心有一个产品名称的数据文件,其中一些“空格”字符实际上是一个 c2a0 序列(“无中断空格”),这个字符串被保存到 $_SESSION某处,我的 Zen Cart 设置被配置为在数据库中存储会话。SHOW FULL COLUMNS FROM zen_sessions;
显示 value
列的 collation_name 是 null
,所以我猜它从数据库中获取它的字符集,而 show variables like "character_set_database";
显示它是 latin1
。就我而言,我通过从数据文件中删除不可靠的空格字符来解决问题。【参考方案3】:
所以我在从 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
【讨论】:
【参考方案4】:以防万一其他答案对您没有帮助... 这也发生在我最近,在开发过程中。在我的环境中,我使用会话对象将会话保存在 PostgreSQL 数据库中。 我使用了一个对象(自定义类型)来设置一个导致错误的会话变量。我正在这样做
$username = new Name($httpRequest->username);
$_SESSION['username'] = $username;
原来是因为我使用自定义数据类型设置会话变量。我通过执行以下操作将其类型转换为原始(字符串)并且错误消失了。
$_SESSION['username'] = (string)$username;
【讨论】:
以上是关于会话在 PHP 中突然被破坏的主要内容,如果未能解决你的问题,请参考以下文章