JSON 或 serialize:PHP 数组存储该选哪个?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JSON 还是 serialize:PHP 开发者的永恒问题

\n\n

想象一下:你正在编写一个 PHP 脚本,需要保存一个包含用户设置的复杂数组。脑海中立刻浮现出两个选项:json_encode() 和 serialize()。该选哪个?这个问题困扰着 Stack Overflow 上成千上万的开发者,今天我们将一劳永逸地弄清楚哪种方法确实更好。

\n\n

我不仅会向您展示枯燥的对比,还会提供真实的代码示例、性能测试以及文档中未提及的陷阱。我们开始吧!

\n\n

json_encode 和 serialize 有什么共同点?

\n\n

这两个函数都将复杂的数据结构(数组、对象)转换为字符串,以便可以保存到文件、数据库或缓存中。但它们的实现方式不同。

\n\n
    \n
  • json_encode — 将数据转换为标准的 JSON 格式(JavaScript 和大多数语言都能理解的文本)。
  • \n
  • serialize — 创建一种内部 PHP 格式,其中包含数据类型信息,并且可以恢复对象并保留其类。
  • \n
\n\n

简单的代码示例

\n\n
<?php\n$array = [\n    'name' => '伊万',\n    'age' => 30,\n    'skills' => ['PHP', 'JavaScript', 'Python']\n];\n\n// JSON\n$json = json_encode($array, JSON_UNESCAPED_UNICODE);\necho $json; // {"name":"伊万","age":30,"skills":["PHP","JavaScript","Python"]}\n\n// Serialize\n$serialized = serialize($array);\necho $serialized; // a:3:{s:4:"name";s:8:"伊万";s:3:"age";i:30;s:6:"skills";a:3:{i:0;s:3:"PHP";i:1;s:10:"JavaScript";i:2;s:6:"Python";}}\n?>
\n\n

立刻就能看出区别:JSON 更紧凑、更易读,而 serialize 则更冗长,但包含更多元数据。

\n\n

关键标准对比

\n\n

让我们把所有内容分门别类。我进行了测试并收集了数据,这些数据将帮助您做出决定。

\n\n

1. 性能:谁更快?

\n\n

许多人认为 serialize 运行更快,因为它是“原生的”PHP 格式。但实际情况更复杂。

\n\n
<?php\n$largeArray = [];\nfor ($i = 0; $i < 10000; $i++) {\n    $largeArray[] = [\n        'id' => $i,\n        'name' => 'User_' . $i,\n        'data' => range(1, 50)\n    ];\n}\n\n// 测试 json_encode\n$start = microtime(true);\n$json = json_encode($largeArray);\n$jsonTime = microtime(true) - $start;\n\n// 测试 serialize\n$start = microtime(true);\n$serialized = serialize($largeArray);  \n$serializeTime = microtime(true) - $start;\n\necho "JSON: {$jsonTime} 秒\\n";\necho "Serialize: {$serializeTime} 秒\\n";\n// 结果:JSON 通常快 10-30%\n?>
\n\n

结论: json_encode 通常更快,尤其是在处理大型数组时。原因是 JSON 使用更简单的算法,无需保存类信息。

\n\n

2. 数据大小:谁更紧凑?

\n\n

JSON 几乎总是在大小上胜出。请自行比较:

\n\n
    \n
  • JSON: {"name":"伊万","age":30} — 26 字节
  • \n
  • Serialize: a:2:{s:4:"name";s:8:"伊万";s:3:"age";i:30;} — 41 字节
  • \n
\n\n

JSON 的优势是 1.5 到 2 倍。如果您在缓存中存储数 GB 的数据,这一点至关重要。

\n\n

3. 安全性:serialize 的隐藏威胁

\n\n

这就是许多人容易犯错的地方。如果向 unserialize() 传递伪造的数据,它可能会执行任意代码。这被称为 PHP 对象注入。

\n\n
<?php\n// 危险示例\n$userInput = $_GET['data']; // 用户可以传递恶意字符串\n$object = unserialize($userInput); // 风险!可能会创建带有危险代码的对象\n\n// 安全替代方案\n$jsonData = json_decode($userInput, true); // 仅仅是数组,没有对象\n?>
\n\n

重要提示: 切勿对来自用户的数据使用 unserialize()。在这方面,JSON 是绝对安全的。

博客

书籍推荐