【问题标题】:PHP Session Serialize ObjectPHP 会话序列化对象
【发布时间】:2017-11-12 07:24:43
【问题描述】:

我从 PHP 5.4 及更低版本中找到了很多关于会话序列化的信息,但对于 PHP 7 来说却不多。几年前,有人建议我在存储类变量 (class object { public $value; function __construct() { $this->value = new object2(); }}) 时使用 $_SESSION['var'] = serialize($object);。

今天,我将我的代码从一种开发环境转移到了另一种。新的似乎不喜欢= serialize($object);,但似乎对= $object 很好。

几周前,我遇到了一些帖子,其中提到 PHP 总是在将变量放入会话之前对其进行序列化,并且自从这次事件(在今天的搜索中)之后,我发现了许多相同的帖子。

在 PHP 的文档中,我提到了 session_register(),它显然应该用于将对象存储在会话变量中……但它显然在 5.3 中已停止使用。

之前的测试告诉我,使用类变量分配会话变量而不首先序列化它们似乎并不能很好地跟踪类变量,尤其是在上述特殊情况下,其中一个变量是另一个类变量 (object2)。

我遇到的问题似乎很偶然,实际上是我去寻找答案并发现序列化开始的原因,一旦我添加了序列化/反序列化(并且没有其他更改),一切正常有意的。

那么,我的问题是:处理 PHP 会话的对象序列化的“真正”方法是什么?

$_SESSION['var'] = serialize($object); 导致 500 错误。 $_SESSION['var'] = $object 没有错误,但由于之前的问题,我不确定它的效果如何。

说到这个话题,反序列化的最佳方法是什么? $object = unserialize($_SESSION['var']); 是我目前的做法。它不会导致错误,但为了可能的小优化和未来的知识,还不如覆盖基础。

如果我的方法(使用serialize() 和unserialize())是正确的,那么哪些设置会导致serialize() 失败?

如果此处的任何“代码”部分有任何拼写错误,我将它们内嵌在帖子中,因此请忽略它们。

【问题讨论】:

    标签: php php-7


    【解决方案1】:

    您可以像保存任何其他值一样在会话中保存对象。在脚本结束时会话得到了serialized and saved:

    当 PHP 关闭时,它会自动获取 $_SESSION 超全局的内容,将其序列化,并使用会话保存处理程序将其发送到存储。

    “主要”问题是,为了再次加载会话,您尝试加载的对象的类定义必须在使用session_start(); 调用之前 可用/加载。除此之外,一切都应该正常工作。

    对于您的 500 服务器错误,您必须检查错误消息和/或错误日志是什么问题。

    【讨论】:

    • 500 错误实际上是由于尝试序列化 PDO 实例,因此该部分已修复...但我之前与会话相关的行为表明类变量未正确存储.因此,尽管 $_SESSION 可能在脚本末尾被序列化,但如果类变量(具体而言)在存储到 $_SESSION 之前没有序列化,可能会出现问题?我不确定,我只知道这种行为是“健忘的”并且有些不可预测,直到我在存储到会话中之前进行了序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2014-07-07
    • 1970-01-01
    • 2011-08-19
    • 2013-10-05
    • 2012-03-12
    • 2012-04-15
    相关资源
    最近更新 更多