我发现了很多关于 PHP 5.4 及以下版本的 session 序列化的信息,但关于 PHP 7 的信息并不多。几年前,有人建议我使用 $_SESSION['var'] = serialize($ object);
存储类变量时 (class object { public $value; function __construct() { $this->value = new object2(); }}
)。
今天,我将代码从一种开发环境转换到另一种开发环境。新的似乎不喜欢 = serialize($object);
但似乎对 = $object
没问题。
几周前,我遇到了一些帖子,其中提到 PHP 总是在将变量放入 session 之前序列化变量,自从这次事件(在今天的搜索期间)以来,我发现了许多相同的帖子。
在 PHP 文档中,我提到了 session_register()
,它显然应该用于在 session 变量中存储对象...但它显然在 5.3 中已停止使用。
之前的测试告诉我,在不首先序列化 session 变量的情况下为 session 变量分配类变量似乎不能很好地跟踪类变量,特别是在像上面这样的特殊情况下,其中一个变量是另一个类变量(object2)。
我遇到的问题似乎是偶然的,事实上,这就是我寻找答案并发现序列化的原因,一旦我添加了序列化/反序列化(并且没有其他更改),一切都正常工作有意为之。
所以,这是我的问题:处理 PHP session 对象序列化的“真正”方法是什么?
$_SESSION['var'] = serialize($object);
导致 500 错误。 $_SESSION['var'] = $object
没有错误,但由于之前的问题,我不确定它的工作效果如何。
在讨论这个主题时,反序列化的最佳方法是什么? $object = unserialize($_SESSION['var']);
是我当前的方法。它不会导致错误,但为了可能的微小优化和 future 的知识,不妨覆盖基础。
如果我的方法(使用serialize()
和unserialize()
)是正确的,什么设置会导致serialize()
失败?
如果这里的任何“代码”片段中有任何拼写错误,我都是在帖子中内联编写的,所以请忽略它们。
最佳答案
您可以像任何其他值一样将对象保存在 session 中。在脚本结束时, session 得到 serialized and saved无论如何:
When PHP shuts down, it will automatically take the contents of the
$_SESSION
superglobal, serialize it, and send it for storage using the session save handler.
“主要”问题是,要再次加载 session ,您尝试加载的对象的类定义必须在使用session_start();
之前可用/加载。称呼。除此之外,一切都应该正常工作。
对于 500 服务器错误,您必须检查错误消息和/或错误日志问题是什么。
关于PHP session 序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47246489/