我已经从PHP 5.4及以下版本中找到了很多关于会话序列化的信息,但对于PHP 7来说并不多。几年前,我建议在存储类变量时使用$_SESSION['var'] = serialize($object);
({ {1}})。
今天,我将代码从一个开发环境转换到另一个开发环境。新的似乎不喜欢class object { public $value; function __construct() { $this->value = new object2(); }}
但似乎没有= serialize($object);
。
几个星期前,我遇到了一些帖子,提到PHP总是将变量序列化,然后再将它们放入会话中,自从这个事件发生(今天的搜索),我发现了很多相同的帖子
在PHP的文档中,我遇到了= $object
的提及,这显然应该用于在会话变量中存储对象......但它显然在5.3中已停止。
之前的测试告诉我,使用类变量分配会话变量而不首先对它们进行序列化并不能很好地跟踪类变量,特别是上面的情况,其中变量是另一个类变量(object2)。
我遇到的问题似乎很突破,实际上是我寻找答案并找到序列化开始的原因,一旦我添加序列化/反序列化(并且没有其他更改),一切都工作为意图。
所以,我的问题是:真实的'处理PHP会话的对象序列化的方法?
session_register()
导致500错误。 $_SESSION['var'] = serialize($object);
没有错误,但由于以前的问题,我不确定它的效果如何。
关于这个主题,什么是反序列化的最佳方法? $_SESSION['var'] = $object
是我目前的做法。它不会导致错误,但为了可能的小优化和未来的知识,不妨覆盖基础。
如果我的方法(使用$object = unserialize($_SESSION['var']);
和serialize()
)是正确的,那么哪些设置会导致unserialize()
失败?
如果任何'代码中有任何拼写错误'在这里,我在帖子中内联写了它们,所以忽略它们。
答案 0 :(得分:1)
您可以将会话中的对象保存为任何其他值。在脚本结束时,会话得到了serialized and saved:
当PHP关闭时,它将自动获取
// outside the scope of the question but maybe useful
超全局的内容,对其进行序列化,并使用会话保存处理程序将其发送以进行存储。
“主要”问题是,为了再次加载会话,您尝试加载的对象的类定义必须在之前使用$_SESSION
调用加载/加载。除此之外一切都应该工作得很好。
对于您的500服务器错误,您必须检查错误消息和/或错误日志问题是什么。