Unserialize()不起作用

时间:2015-10-10 16:12:22

标签: php serialization

我有一个PHP脚本(称为客户端),它从另一台服务器上的PHP脚本(称为服务器)获取请求。服务器序列化此数据并将其发送到客户端:

stdClass Object (
    [version] => 0.3
    [date] => 2010-04-10
    [package] => http://my.site/test-plugin-update/test-plugin-update.zip
    [slug] => test-plugin-update
    [new_version] => 0.3
)

客户端接受它并将其反序列化为:$response = unserialize($raw_response['body'])

但是,$response是空的!

如果我这样做:var_dump(unserialize($raw_response['body']))我明白了:bool(false)

如果我这样做:print_r($raw_response['body'])我明白了:

O:8:"stdClass":5:{s:7:"version";s:3:"0.3";s:4:"date";s:10:"2010-04-10";s:7:"package";s:56:"http://my.site/test-plugin-update/test-plugin-update.zip";s:4:"slug";s:18:"test-plugin-update";s:11:"new_version";s:3:"0.3";}

如果我在unserialize()电话中手动粘贴它,我会得到一个漂亮的物体:

stdClass Object (
    [version] => 0.3
    [date] => 2010-04-10
    [package] => http://my.site/test-plugin-update/test-plugin-update.zip
    [slug] => test-plugin-update
    [new_version] => 0.3
)

知道我为什么会遇到这种行为,或者我可以做些什么来以编程方式对字符串进行反序列化?

1 个答案:

答案 0 :(得分:0)

我让你跑

var_dump(serialize($raw_response['body']));

你得到了输出

s:217:" O:8:"stdClass":5:{s:7:"version";s:3:"0.3";s:4:"date";s:10:"2010-04-10";s:7:"pack‌​age";s:56:"http://my.site/test-plugin-update/test-plugin-update.zip";s:4:"slug";s‌​:18:"test-plugin-update";s:11:"new_version";s:3:"0.3";}";

正如您在开头看到的那样(s:217:" 0:8 ...),在实际serialize输出开始之前,您有一个空格。当我尝试unserialize时,我会注意到这一点:unserialize(): Error at offset 0 of 217 bytes(偏移0因为unserialize不期望开头有空格。)

正确的解决方法是找出服务器在发送序列化输出并修复之前添加空间的原因。

但作为一种解决方法,你可以做到

var_dump(unserialize(preg_replace('/^\s+/', '', $raw_response['body'])));

在客户端上。