【问题标题】:Session destroyed out of nowhere in PHP会话在 PHP 中突然被破坏
【发布时间】:2016-04-28 22:42:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 现在同样的问题。我们将会话保存在数据库中。它出现在我将自定义创建的 PDO 对象更改为来自 Eloquent/Capsule 的对象之后。还是不知道,这两个 PDO-Object 有什么区别。
  • 处理 unicode 时在我的应用程序中弹出此问题。自定义会话处理程序不正确地写入数据库并且无法取回它。
  • 只检查是否使用数据库存储进行会话检查列的数据类型和长度
  • 如果某些 Unicode 字符和存储在数据库中的会话出现此问题,请确保数据确实以二进制形式存储,而不是作为字符数据。如果您无法更改列类型,base64 编码/解码可能会有所帮助。 PHP issue #71088 可能与 PostgreSQL 用户相关。

标签: php session cakephp cakephp-3.1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我所做的是使用排序规则 utf8mb4_unicode_ci 更新到字符集 utf8mb4

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

    This guide might help >

    【讨论】:

    • 我有一个类似的问题,我不小心有一个产品名称的数据文件,其中一些“空格”字符实际上是一个 c2a0 序列(“无中断空格”),这个字符串被保存到 $_SESSION某处,我的 Zen Cart 设置被配置为在数据库中存储会话。 SHOW FULL COLUMNS FROM zen_sessions; 显示 value 列的 collat​​ion_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;
      

      【讨论】:

        猜你喜欢
        • 2014-07-02
        • 2013-10-31
        • 2019-07-01
        • 1970-01-01
        • 2023-03-04
        • 2019-02-23
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        相关资源
        最近更新 更多