serialize反序列化速度远超json_decode,实测快20–200倍;但json_encode更省空间、跨语言且安全,适合Web API;serialize则保真PHP类型,适用于Session和对象持久化。

如果您需要在PHP中对数据进行序列化操作,但不确定应选用 json_encode/json_decode 还是 serialize/unserialize,那么性能差异可能直接影响系统响应与内存开销。以下是针对这两组函数的效率对比测试方法及实测结果:
一、基础性能对比测试方法
该方法通过 microtime(true) 精确测量函数执行耗时,使用统一规模的数据集(如100万元素数组)进行多轮基准测试,排除偶然误差。所有测试均在相同 PHP 版本、关闭 OPcache 干扰、设置足够 memory_limit 的环境下运行。
1、定义测试数据:使用 array_fill(0, 1000000, rand(1, 9999)) 构建整型数组。
2、依次执行 json_encode、serialize、igbinary_serialize(若已安装)并记录耗时。
3、对各序列化结果分别调用 json_decode、unserialize、igbinary_unserialize,再次记录反序列化耗时。
4、重复执行 3–5 次取平均值,确保结果稳定性。
二、编码阶段(序列化)性能表现
在百万级整型数组测试中,编码速度排序为:igbinary_serialize < json_encode < serialize。实测数据显示:igbinary 编码仅需约 0.047 秒,json_encode 约 0.085 秒,serialize 则达 0.382 秒。当数据含大量中文字符或嵌套结构时,json_encode 在启用 JSON_UNESCAPED_UNICODE 参数后编码性能明显下降。
1、纯数字数组场景下,json_encode 编码体积最小(约 5MB),serialize 达 15.9MB,igbinary 为 7.9MB。
2、复杂嵌套对象(含方法、资源句柄等)无法被 json_encode 处理,而 serialize 可完整保留类型与结构信息。
3、serialize 对含私有/受保护属性的对象支持原生序列化,json_encode 仅输出公有属性且丢失类型标识。
三、解码阶段(反序列化)性能表现
反序列化环节差距更为显著:igbinary_unserialize 最快(约 0.234 秒),json_decode 次之(约 0.350 秒),unserialize 明显滞后(约 7.79 秒)。尤其在大数据量下,unserialize 的解析开销呈非线性增长,极易触发内存耗尽错误。
1、当输入字符串并非合法 JSON 格式时,json_decode 返回 NULL,不报错;而 unserialize 遇到非法格式会抛出 Warning 并中断执行。
2、unserialize 存在远程代码执行风险,若反序列化内容来自不可信来源,必须严格校验输入完整性与来源可信度。
3、json_decode 默认返回 stdClass 对象,添加第二个参数 true 可强制返回关联数组,与 unserialize 行为对齐。
四、内存占用与容错能力对比
内存压力是关键区分点:对含 20 万个子数组的大结构执行 serialize 时,常触发 “Allowed memory size exhausted” 错误;而 json_encode 在同等条件下仍可完成,说明其内存管理更轻量。容错方面,json_decode 对无效输入静默返回 NULL,unserialize 则直接报 Notice 或 Fatal Error。
1、json_encode 对 UTF-8 字符串天然友好,无需额外转义;serialize 将所有字符按字节流处理,无编码依赖。
2、当变量类型不确定(如可能为字符串或数组)时,json_decode($str) 安全返回 NULL,unserialize($str) 可能导致解析崩溃。
3、serialize 输出含类型前缀(如 a:1:{i:0;s:3:"abc";}),可精确还原原始结构;json_encode 输出无类型标记(如 ["abc"]),反序列化后均为 array 或 object,丢失原始类型语义。
五、适用场景选择策略
无需通用抽象,应依据具体需求匹配:跨语言通信、前端交互、日志存储等场景优先采用 json_encode;服务端内部缓存、Session 序列化、对象持久化等强类型保真需求,则 serialize 更可靠;高频读写且追求极致性能的扩展环境,可引入 igbinary 扩展替代原生方案。
1、若目标系统需与 JavaScript、Python、Java 等互通,必须使用 json_encode/json_decode,因其格式标准化且广泛支持。
2、若数据含 Closure、resource、DOMDocument 等不可 JSON 化类型,serialize 是唯一可行选项。
3、在 Redis 或 Memcached 中存储 PHP 对象时,若已启用 igbinary 扩展,开启 igbinary_serialize 可降低网络传输量与 CPU 开销。



















