当前位置: 首页 > 后端技术 > PHP

PHPNotice-unserialize()-ErroratoffsetXXofXXbytes

时间:2023-03-29 23:17:18 PHP

同事在本地开发的时候报错,如下图:字面意思就是反序列化错误,序列化和反序列化的应用,以及当php数组的key是string类型的数值时会发生什么。先看序列化$str=[1=>2,'str'=>'string'];var_dump(serialize($str));//结果:serialize.php:7:string'a:2:{i:1;i:2;s:3:"str";s:9:"string";}'(length=40)//第一个a表示数据为数组2表示长度为2//{}表示数组内容//i:1;i:2//i表示key为inttype1表示key值为1//i表示value为inttype2表示value值为2//s:3:"str";s:9:"string"//s表示key为stringtype3表示key长度为3"str"表示值为"str"//s表示值为stringtype9表示值为value长度为9"string"表示值为"string"。第二点PHP中的数组会自动将常量PHP_INT_MAX(int最大值)范围内的string类型的数字键转换为int类型。如果数组的key超过常量PHP_INT_MAX的值,则key保持string类型,否则转为int类型。示例代码如下:var_dump(PHP_INT_MAX);$str=['1'=>111,'9223372036854775808'=>'PHP_INT_MAX+1'];变量转储($str);输出结果如下:可以看到keyis'1'在输出的时候变成了1,大于PHP_INT_MAX的值仍然是一个字符串。回到header反序列化错误bug。同事在本地开发的PHP_INT_MAX和测试环境是不一样的,本地开发环境和测试环境存放的是同一个数据。这时候就会出现错误。即在本地开发中,PHP_INT_MAX可能较小,序列化会将值转为s,而测试环境PHP_INT_MAX较大,序列化会将值转为i。这时候存储不统一,会造成在一个环境下序列化,在另一个环境下反序列化,报题目的错误。