【发布时间】: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() 失败?
如果此处的任何“代码”部分有任何拼写错误,我将它们内嵌在帖子中,因此请忽略它们。
【问题讨论】: