我有一个在 Google App Engine 上运行的应用程序(使用 PHP 5.5.38),并且我使用 Laravel 包来缓存查询结果。
这对于类似的项目效果很好,但对于这个项目,我收到诸如“unserialize(): Error at offset 14 of 860 bytes”之类的错误(数字有所不同,具体取决于序列化的内容。)
错误发生在只有这两个函数的类中:
public function encode($data){
return serialize($data);
}
public function decode($data){
return unserialize($data);
}
我发现在本地测试应用程序时,一切正常,序列化数据如下所示:
a:1:{i:0;O:8:"stdClass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";...
但是当我使用相同的数据在 App Engine 上运行它时,它会返回以下内容:
a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";...
这里可能不会显示,但“*”旁边有一些不可见的字符(在 Notepad++ 中,它们显示为[ENQ]和[DLE])。
我相信对 unserialize() 的调用失败,因为序列化数据包含 @*lass 而不是 stdClass,但我不知道是什么原因导致的,也不知道如何防止它。我尝试使用 str_replace,它一开始有效,但并非适用于所有情况。我还确保 PHP 使用 UTF-8 作为默认字符集。
编辑:我修改了编码函数以尝试查明故障开始的时刻。 我现在有:
public function encode($data)
{
$serialized = serialize($data);
try{
unserialize($serialized);
} catch (\Exception $ex) {
var_dump($serialized);
die;
}
return $serialized;
}
当它在服务器上执行时,它输出:
a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach"; ...
所以看起来问题是在保存或取消序列化任何内容之前开始的。
最佳答案
可能不是一个理想的解决方案,但这似乎有效......
public function encode($data)
{
return serialize(json_decode(json_encode($data), true));
}
public function decode($data)
{
return json_decode(json_encode(unserialize($data)));
}
问题似乎来自于序列化 stdClass 对象数组,因此我认为它将有助于将 stdClass 转换为关联数组。
关于PHP serialize() 未正确序列化 stdClass 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46301648/