php unserialize在不同机器上的工作方式不同

时间:2011-12-15 08:27:20

标签: php arrays serialization php-5.3

我有一个已经被php序列化的数组,结果是:

unserialize('a:2:{s:13:"custom_basket";a:1:{i:280583837398;a:4:{s:12:"product_name";s:0:"";s:8:"quantity";s:1:"1";s:5:"price";d:38.649999999999999;s:11:"description";a:7:{s:2:"id";s:12:"280583837398";s:3:"sku";s:0:"";s:4:"site";s:2:"UK";s:12:"condition_id";s:4:"1000";s:14:"transaction_id";s:12:"773563256018";s:8:"platform";s:4:"eBay";s:18:"order_line_item_id";s:25:"280583837398-773563256018";}}}s:6:"basket";a:0:{}}')

当我使用运行php 5.3.5的机器时,我得到:

  

注意:unserialize()[function.unserialize]:405字节的偏移46处的错误

当我旁边的家伙在运行5.3.6的机器上运行时,他将阵列退出。我们运行php 5.3.4的服务器也成功地反序列化了数组。

我得到的错误指向第二个数组i:280583837398中的第一个键,如果我也改变它s:12:"280583837398"我的机器现在可以成功地反序列化数组。

有没有人知道为什么会这样。我不知道它是不是php版本,我只是注意到我对两台成功的机器有不同的版本所以认为值得一提。

如果有帮助的话,我在Snow Leopard上运行MAMP PRO。

2 个答案:

答案 0 :(得分:1)

不确定是否是版本,但也许不同版本的处理方式不同。看起来你理解s意味着一个x长度的字符串,因此s:12是一个长度为12的字符串。但是如果php试图将其解析为32位int,那么它可能会失败。

答案 1 :(得分:0)

280583837398是一个非常大的数字,也许你的机器试图将它装在integer中,它支持最多32位的数字。

您可能需要long才能存储此内容。

这就是我现在可以告诉你的一切。