将PHP序列化从PHP 5.3迁移到PHP 5.6

时间:2016-11-27 16:32:44

标签: php serialization migration

我有一个复杂的结构,使用serialize()函数保存在MySQL数据库中,然后使用unserialize()转换回来。将系统从PHP 5.3迁移到PHP 5.6并在5.6中反序列化在5.3上序列化的数据后,结构已损坏。对象的某些引用现在显示为数组。

我的问题是:

  1. 是否有关于不同PHP版本中序列化/反序列化使用的不同编码的规范? (在我的Google搜索或PHP.net上的文档中找不到任何具体的内容)

  2. 如何将序列化数据从PHP 5.3编码转换为PHP 5.6编码?

2 个答案:

答案 0 :(得分:4)

是的,在PHP5.6中更改了对象的序列化。具体而言,许多与对象序列化相关的领域都在PHP5.6中进行了整理

PHP unserialize manual中有一个含糊的提示:

  

5.6.0通过将O:替换为C来操作序列化数据:强制对象实例化而不调用构造函数   失败。

然而,看看错误列表会发现report 68099内有更多内容。它还指出原始格式没有官方文件:

  

“原始行为(我们允许旧的序列化格式)   用于使用新格式的类)从未记录过   官方支持,“

请注意,该讨论的最终结果是“无法修复”

所以基本上,你的选择是:

  • 尝试使用其他一个序列化程序作为在PHP版本之间导出数据的方法。例如session_encode也可以处理对象。

  • 转换脚本。有一个广泛记录的版本 PHP internals上的当前格式,您可以使用它 旧格式上的迭代器更新语法。

答案 1 :(得分:1)

您可以将序列化数据转换为JSON(使用PHP 5.3的安装),将其保存到数据库,然后执行对等(使用PHP 5.6的安装)。

从5.3到JSON:

$data = unserialize($strSerializedData);
$jsonData = json_encode($data);

从JSON到5.6:

$data = json_decode($jsonData);
$strSerializedData= serialize($data );

您可能需要调整发送到json_decode的选项以匹配原始数据。

此选项取决于要序列化的数据。如果您的数据是类,则无效。

此外,您的问题可能与文档(here)中的此注释有关:

  

5.6.0通过将C:替换为O来操作序列化数据:强制对象实例化而不调用构造函数现在将失败。