标签归档:json

msgpack二进制打包协议

MessagePack简称msgpack,官方网站是http://msgpack.org/ ,代码可以在github上查看https://github.com/msgpack。

官方介绍是“Extremely efficient object serialization library for cross-language communication.It’s like JSON, but very fast and small.”, 是一种 跨语言的基于二进制的数据格式。

从官方的介绍来看 , 它能够比google protocol buffers快4倍,比json快10倍多 。

下面给PHP安装msgpack扩展

先查找有没有phpize工具

 

 

不好意思,报错了,根据他说的来吧

 

 

文件添加 extension=msgpack.so

service php-fpm restart 再次重启,成功!

php -m | grep msgpack
php -i | grep msgmack

安装成功以后,来一段代码吧。

MessagePack的核心压缩方式:

1.true、false 之类的:这些太简单了,直接给1个字节,(0xc2 表示true,0xc3表示false)

2.不用表示长度的:就是数字之类的,他们天然是定长的,是用一个字节表示后面的内容是什么东东,比如用(0xcc 表示这后面,是个uint 8,用oxcd表示后面是个uint 16,用 0xca 表示后面的是个float 32).

3.不定长的:比如字符串、数组,类型后面加 1~4个字节,用来存字符串的长度,如果是字符串长度是256以内的,只需要1个字节,MessagePack能存的最长的字符串,是(2^32 -1 ) 最长的4G的字符串大小。

4.ext结构:表示特定的小单元数据。

5.高级结构:MAP结构,就是key=>val 结构的数据,和数组差不多,加1~4个字节表示后面有多少个项。

 

为啥会快?

先说说JSON怎么解析吧,我们开发中一般都用cJSON这个库,cJSON存储的时候是采用链表存储的,其访问方式很像一颗树。每一个节点可以有 兄妹节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。问题就是首先,构造这 个链表的时候,得一个字符一个字符地匹配过去吧,得判断是不是引号、括号之类的吧…

但是MessagePack 则简单多了,直接一遍遍历过去了,从前面的数据头,就可以知道后面的是什么数据,指针应该向后移动多少,比JSON的构建链表少了很多比较的过程。

来计算个数据吧,把刚才的数组,encode、decode重复1000000万次:

[root@test www]# php msgpack.php
json time: 5.0772788524628
msgpack time: 2.5925579071045

大概是快这么多吧,如果数组更大,理论上,MessagePack比Json快更多。

 

注:部分内容来自互联网

 

php如何判断是否为json串(格式)

php如何判断是否为json串(格式),如果不是json则返回false