session_start()php中的UnexpectedValueException导致SPLObjectStorage序列化失败

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)

RolestorageSPLObjectstorage 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)在反序列化时打印然后失败并显示相同的消息.我不知道为什么会这样.

注意:在将对象附加到RoleStorageI时,将对象本身用作数据.表示它存储为参考.我不知道(if)如何在serialize()内部处理这个问题.

hak*_*kre 2

我不知道为什么会发生这种情况

在您的 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 中的引用/变量别名不同)。

那么如何继续呢?

现在是时候开始隔离您的问题并从中创建一个独立的、可重现的示例了。这是必要的,以便进一步研究您所看到的问题。这很重要,原因有二:

  1. 如果这是 PHP 中的错误,则应报告该错误,编写回归测试并将其添加到 PHP 问答中,然后修复该错误(如果尚未修复)。
  2. 如果您正在寻找解决方法,则必须重现原始问题才能快速轻松地创建解决方法。

我确实运行了一些测试来解决问题,但是到目前为止,我无法重现您的问题,因此我无法真正建议如何解决该问题,因为我这里没有。