我在Google App Engine上运行了一个应用程序(使用PHP 5.5.38),并且我使用Laravel程序包来缓存查询结果。
这适用于类似的项目,但对于这个,我得到错误,例如," unserialize():错误在860字节的偏移量14和#34; (数字因系列化而异。)
错误发生在只有这两个函数的类中:
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";...
这里可能没有显示,但是' *'旁边有隐形字符。 (在记事本++中,它们显示为[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"; ...
因此,在保存或反序列化任何内容之前,问题似乎就开始了。
答案 0 :(得分:1)
可能不是一个理想的解决方案,但这似乎有用......
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转换为关联数组。