var*_*uog 5 php spl serialization splobjectstorage
为什么会UnexpectedValueException
被抛入session_start()
?
我有具有属性的对象SPLObjectstorage
.该对象被分配给会话
$_SESSION['foo'] = $barObject;
Run Code Online (Sandbox Code Playgroud)
我怀疑内部会话序列化面临问题解码它.我将会话存储在数据库中,看起来它正在序列化objectStorage
但无法对其进行解码.
会话数据示例
self|O:4:"User":8:{s:5:"?*?id";N;s:7:"?*?nick";N;s:13:"?*?reputation";i:1;s:11:"?*?password";N;s:8:"?*?email";N;s:7:"?*?crud";O:10:"CRUDobject":2:{s:13:"?*?fieldCache";a:0:{}s:13:"?*?dependency";r:1;}s:7:"?*?auth";N;s:11:"?*?roleList";C:11:"RoleStorage":23:{x:i:1;N;,r:13;;m:a:0:{}}}
Run Code Online (Sandbox Code Playgroud)
Rolestorage
SPLObjectstorage
session_decode()
在上面的字符串的延伸也返回false
任何想法?
删除roleList
属性使其正确序列化.
如果我单独做
$sr = serialize($roles); // $roles is RoleStorage object
var_dump($sr);
var_dump(unserialize($sr));
Run Code Online (Sandbox Code Playgroud)
它string 'C:11:"RoleStorage":22:{x:i:1;N;,r:3;;m:a:0:{}}' (length=46)
在反序列化时打印然后失败并显示相同的消息.我不知道为什么会这样.
注意:在将对象附加到RoleStorage
I时,将对象本身用作数据.表示它存储为参考.我不知道(if)如何在serialize()
内部处理这个问题.
我不知道为什么会发生这种情况
在您的 PHP 版本和具体脚本SPLObjectStorage
中,除非您自己处理序列化,否则不可能序列化基于的对象。如果您看到序列化字符串的这一部分:
C:11:"RoleStorage":23:{x:i:1;N;,r:13;;m:a:0:{}}
Run Code Online (Sandbox Code Playgroud)
这代表了RoleStorage
对象。开头的大C代表:
C - 实现可序列化接口的对象
所以对象本身在这里负责序列化和反序列化。您通常可以预期这是有效的,但并非所有软件都没有错误。
在你的例子中,PHP 似乎犯了一个错误。这里的内部格式是:
x:i:1;N;,r:13;;m:a:0:{}
^^^^^^^
Run Code Online (Sandbox Code Playgroud)
而问题就出在突出显示的位置,这需要一个序列化的对象,而不是NULL。而且它不是用引用(r:13
此处)以逗号结尾,而是用 null ( N
) 来工作。
所以看起来像是通过引用一些早期对象触发的小插曲(请注意,此引用与用户态 PHP 中的引用/变量别名不同)。
那么如何继续呢?
现在是时候开始隔离您的问题并从中创建一个独立的、可重现的示例了。这是必要的,以便进一步研究您所看到的问题。这很重要,原因有二:
我确实运行了一些测试来解决问题,但是到目前为止,我无法重现您的问题,因此我无法真正建议如何解决该问题,因为我这里没有。