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

为什么在session_start()中抛出UnexpectedValueException?

我有一个具有SPLObject存储属性的对象.该对象被分配给会话

$_SESSION['foo'] = $barObject;

我怀疑内部会话序列化面临问题解码它.我将会话存储在数据库中,看起来它正在序列化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:{}}}

Rolestorage是SPLObjectstorage的扩展
session_decode()上面的字符串也返回false任何想法?

删除roleList属性使其正确序列化.

如果我单独做

$sr = serialize($roles); // $roles is RoleStorage object
var_dump($sr);
var_dump(unserialize($sr));

它打印字符串’C:11:“RoleStorage”:22:{x:i:1; N;,r:3 ;; m:a:0:{}}'(长度= 46)然后失败并显示相同的消息在反序列化时.我不知道为什么会这样.

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

解决方法:

I have no clue why this is happening

在您的PHP版本和您的具体脚本中,除非您自己处理序列化,否则无法基于SPLObjectStorage序列化对象.
如果您看到序列化字符串的这一部分:

C:11:"RoleStorage":23:{x:i:1;N;,r:13;;m:a:0:{}}

这表示RoleStorage对象. stands for开头的大C:

C – Object implementing 07001

因此,对象本身负责序列化和反序列化.您通常可以期待这项工作,但并非所有软件都没有错误.

在你的情况下,它看起来像PHP犯了一个错误.这里的内部格式是:

x:i:1;N;,r:13;;m:a:0:{} 
      ^^^^^^^

问题出在突出位置,这需要一个序列化对象,而不是NULL.并且它不是以逗号结尾(这里是r:13),而是使用null(N)工作.

所以看起来像是通过引用一些早期对象触发的hick-up(注意这个引用与userland PHP中的引用/变量别名不同).

那怎么继续?

现在是时候开始孤立你的问题并创建一个独立的,可重现的例子了.如您所见,这对于进一步研究问题是必要的.这有两个重要原因:

>如果这是PHP中的错误,应报告,编写回归测试并添加PHP Q& A然后修复错误(如果尚未修复).
>如果您正在寻找解决方法,则需要重现原始问题,以便快速轻松地创建解决方法.

我确实为一个解决方法运行了一些测试,但到目前为止我无法重现你的问题所以我无法真正建议如何解决这个问题,因为我没有在这里.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...