存储PHP数组的首选方法(json_encode vs序列化)

存储PHP数组的首选方法(json_encode vs序列化)

为了缓存的目的,我需要将多维关联数组数据存储在一个平面文件中。我偶尔会发现需要将其转换为JSON,以便在我的Web应用程序中使用,但大部分时间我将直接使用PHP中的数组。

在这个文本文件中将数组存储为JSON还是PHP序列化数组会更有效吗?我环顾四周,似乎在PHP(5.3)的最新版本中,json_decode实际上比unserialize.

目前,我倾向于将数组存储为JSON,因为我觉得如果有必要的话,它更容易被人读取,它可以在PHP和JavaScript中使用,只需花费很少的努力,而且从我所读到的内容来看,解码速度甚至可能更快(不过,对编码不太确定)。

有人知道有什么陷阱吗?有谁有很好的基准来显示这两种方法的性能优势?


一只斗牛犬
浏览 895回答 3
3回答

心有法竹

取决于你的轻重缓急。如果性能是你绝对的驾驶特点,那么一定要使用最快的。在做出选择之前,一定要充分理解这些差异。不像serialize()您需要添加额外的参数以保持UTF-8字符不受影响:json_encode($array, JSON_UNESCAPED_UNICODE)(否则,它会将UTF-8字符转换为Unicode转义序列)。JSON将没有对象的原始类的内存(它们总是被还原为stdClass的实例)。你不能利用__sleep()和__wakeup()用JSON默认情况下,只有公共属性使用JSON序列化。(在PHP>=5.4你可以实现JsonSerialable若要更改此行为,请执行以下操作。JSON更便携而且可能还有一些其他的差异,我现在无法想象。一种简单的速度测试来比较这两种情况<?php ini_set('display_errors',&nbsp;1);error_reporting(E_ALL);//&nbsp;Make&nbsp;a&nbsp;big,&nbsp;honkin&nbsp;test&nbsp;array//&nbsp;You&nbsp;may&nbsp;need&nbsp;to&nbsp;adjust&nbsp;this&nbsp;depth&nbsp;to&nbsp;avoid&nbsp;memory&nbsp;limit&nbsp;errors$testArray&nbsp;=&nbsp;fillArray(0,&nbsp;5);//&nbsp;Time&nbsp;json&nbsp;encoding$start&nbsp;=&nbsp;microtime(true);json_encode($testArray);$jsonTime&nbsp;=&nbsp;microtime(true)&nbsp;-&nbsp;$start;echo&nbsp;"JSON&nbsp;encoded&nbsp;in&nbsp;$jsonTime&nbsp;seconds\n";//&nbsp;Time&nbsp;serialization$start&nbsp;=&nbsp;microtime(true);serialize($testArray);$serializeTime&nbsp;=&nbsp;microtime(true)&nbsp;-&nbsp;$start;echo&nbsp;"PHP&nbsp;serialized&nbsp;in&nbsp;$serializeTime&nbsp;seconds\n";//&nbsp;Compare&nbsp;themif&nbsp;($jsonTime&nbsp;<&nbsp;$serializeTime)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("json_encode()&nbsp;was&nbsp;roughly&nbsp;%01.2f%%&nbsp;faster&nbsp;than&nbsp;serialize()\n",&nbsp;($serializeTime&nbsp;/&nbsp;$jsonTime&nbsp;-&nbsp;1)&nbsp;*&nbsp;100);}else&nbsp;if&nbsp;($serializeTime&nbsp;<&nbsp;$jsonTime&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf("serialize()&nbsp;was&nbsp;roughly&nbsp;%01.2f%%&nbsp;faster&nbsp;than&nbsp;json_encode()\n",&nbsp;($jsonTime&nbsp;/&nbsp;$serializeTime&nbsp;-&nbsp;1)&nbsp;*&nbsp;100);}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Impossible!\n";}function&nbsp;fillArray(&nbsp;$depth,&nbsp;$max&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;$seed; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(is_null($seed))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$seed&nbsp;=&nbsp;array('a',&nbsp;2,&nbsp;'c',&nbsp;4,&nbsp;'e',&nbsp;6,&nbsp;'g',&nbsp;8,&nbsp;'i',&nbsp;10); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($depth&nbsp;<&nbsp;$max)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$node&nbsp;=&nbsp;array(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($seed&nbsp;as&nbsp;$key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$node[$key]&nbsp;=&nbsp;fillArray($depth&nbsp;+&nbsp;1,&nbsp;$max); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$node; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'empty';}

慕桂英4014372

杰森比PHP的序列化格式更简单和更快,应该使用除非:您正在存储深度嵌套数组:json_decode():“如果JSON编码的数据深于127个元素,此函数将返回false。”您正在存储需要非序列化为正确类的对象您正在与不支持json_decode的旧PHP版本交互

Cats萌萌

我写了一篇关于这个主题的博客:“缓存一个大数组:json、序列化还是var_export?“.在这篇文章中,序列化是从小到大数组的最佳选择,对于非常大的数组(>70 MB),JSON是更好的选择。
打开App,查看更多内容
随时随地看视频慕课网APP