真是个不错的话题,在看了几个答案后,我想分享我在这个问题上的实验。
我有一个用例,几乎每次与数据库对话时都需要查询一些“巨大的”表(不要问为什么,只是一个事实)。数据库缓存系统是不合适的,因为它不会缓存不同的请求,所以我想到了php缓存系统。
我尝试了apcu,但它不符合需求,内存在这种情况下不够可靠。下一步是通过序列化将缓存到文件中。
表有14355个条目,有18列,这些是我的测试和读取序列化缓存的统计:
JSON:
正如大家所说,json_encode/json_decode的主要不便之处在于它将所有内容转换为StdClass实例(或对象)。如果你需要循环它,你可能会把它转换成一个数组,是的,这会增加转换时间
平均时间:780.2 ms;内存使用:41.5MB;缓存文件大小:3.8MB
Msgpack
@hutch提到了msgpack。漂亮的网站。让我们试一试,好吗?
平均时间:497 ms;内存使用:32MB;缓存文件大小:2.8MB
这样好多了,但需要一个新的扩展;编译有时害怕的人…
IgBinary
@GingerDog提到了igbinary。注意,我设置了igbinary.compact_strings= off,因为我更关心读取性能而不是文件大小。
平均时间:411.4 ms;内存使用:36.75MB;缓存文件大小:3.3MB
比味精包装好。不过,这个也需要编译。
系列化/非系列化
平均时间:477.2 ms;内存使用:36.25MB;缓存文件大小:5.9MB
比JSON更好的性能,数组越大,json_decode就越慢,但你已经知道了。
这些外部扩展缩小了文件大小,在纸上看起来很棒。数字不会说谎。如果您得到的结果与使用标准PHP函数得到的结果几乎相同,那么编译扩展还有什么意义呢?
我们还可以推断出,根据你的需求,你会选择与别人不同的东西:
IgBinary真的很好,比MsgPack执行得更好
Msgpack更擅长压缩数据(注意,我没有尝试igbinary
紧凑。字符串选项)。
不想编译?使用标准。
就是这样,另一个序列化方法的比较,帮助您选择一个!
*使用PHPUnit 3.7.31测试,php 5.5.10 -仅使用标准硬盘和旧双核CPU解码- 10个相同用例测试的平均数字,您的统计数据可能不同