php MessagePack介绍


Posted in PHP onOctober 06, 2013

1,今天在hacknews上看到很多人对messagepack的争论。首先了解什么是MessagePack:MessagePack is a binary-based efficient object serialization library. It enables to exchange structured objects between many languages like JSON. But unlike JSON, it is very fast and small.

2,MessagePack的主要用途,作者解释说有两大用途:一是Space-efficient storage for Memcache entries (Pinterest),节省空间类型的mamcache应用;另一个是用于RPC传输, This use case is fairly close to my original intent. When one is designing an RPC system, one of the first tasks is to specify and implement a communication protocol. This process can get pretty hairy as you need to worry about a lot of low-level issues like Endian-ness. By using MessagePack, one can skip designing and implementing a communication protocol entirely and accelerate development.

3,争议的地方是MessagePack的benchmark说,他比protocolBuffer,Json快很多倍。但是有人不相信,做个javasript下的测试(json与messagePack)。发现MessagePack仅是压缩后的数据比json少10%左右,而压缩和解压时间则和json的解析器比起来要费时很多。

4,“MsgPack vs. JSON: Cut your client-server exchange traffic by 50% with one line of code”这篇文章使用了messagePack做服务器的优化,降低服务器的数据量,更加合理的利用带宽。作者强调了他们宁愿浪费客户端的0.5ms—1ms,但是服务器使用ruby的MessagePack解析器,效率能够比JSON快5倍。

The difference to JSON is, that MsgPack is binary-based - this gives the possibility to make the exchanged data a) smaller and use less bytes, I guess we all know the advantages of that, however there is an even bigger advantage: b) It is faster to parse and encode, having a parser parse 40 bytes takes about twice as long as parsing 20 bytes.

myJSONString = JSON.stringify(myObject); 
myObject = JSON.parse(myJSONString); 
var myByteArray = msgpack.pack(myObject); 
myObject = msgpack.unpack(myByteArray);

MessagePack作者也认为MessagePack may not be the best choice for client-side serialization as described by the blog author.引用2的作者有点小悲剧。

5,BSon是Json的二进制形式,但是与JSon有语法不兼容的地方。但是MessagePack保证语义上能够做到一致。

6,场景需求不同,导致技术的应用有所差异。

PHP试用MessagePack

It's like JSON. but fast and small.

这句吸引了我,去瞧了下。

官网:http://msgpack.org

官方的安装方法忽悠人,msgpack目录下根本没php目录...只看到csharp,erlang,go,java,ruby等目录。

git clone https://github.com/msgpack/msgpack.git 
cd msgpack/php 
phpize 
./configure && make && make install

还是在PHP官网扩展找到了:http://pecl.php.net/package/msgpack
最后更新时间:2012-09-14,昨天的版本。
附安装过程:

wget http://pecl.php.net/get/msgpack-0.5.2.tgz 
tar zxf msgpack-0.5.2.tgz 
cd msgpack-0.5.2 
/usr/local/hx/php/bin/phpize 
./configure --with-php-config=/usr/local/hx/php/bin/php-config 
make && make install

然后把msgpack.so加到php.ini里,重启php,完成安装。

开始测试:
$data = array(0=>'abcdefghijklmnopqrstuvwxyz',1=>'厦门','abc'=>'1234567890');

分别对其msgpack_pack,json_encode,serialize,长度为:50,62,87
然后分别执行10000次,耗时:9.95 毫秒,17.45 毫秒,8.85 毫秒
解开执行10000次,耗时:14.76 毫秒,23.93 毫秒,14.61 毫秒

msgpack的性能至少超过json50%,虽然和serialize其实速度差不多,但serialize占用空间明显比较多。

另外,GBK的程序方便了,中文也可以msgpack_pack,用json的话还要批量转换成utf-8之后才能json_encode。

引用:

1,MessagePack官方网站

2,MsgPack vs. JSON: Cut your client-server exchange traffic by 50% with one line of code

HN评论地址:http://news.ycombinator.com/item?id=4090831

3,My thoughts on MessagePack

HN评论地址:http://news.ycombinator.com/item?id=4092969

4 JS下MessagePack与JSON性能对比

HN评论地址:http://news.ycombinator.com/item?id=4091051

PHP 相关文章推荐
php下连接mssql2005的代码
Jan 17 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php微信支付之APP支付方法
Mar 04 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
Mar 08 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
Apr 13 PHP
详解Laravel框架的依赖注入功能
May 27 PHP
php 批量替换程序的具体实现代码
Oct 04 #PHP
php5.5中类级别的常量使用介绍
Oct 02 #PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 #PHP
PHP文件上传主要代码讲解
Sep 30 #PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 #PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 #PHP
PHP设置一边执行一边输出结果的代码
Sep 30 #PHP
You might like
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
javascript实现动态标签云
2015/10/16 Javascript
Javascript复制实例详解
2016/01/28 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python编写简单端口扫描器
2019/09/04 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
销售业务员岗位职责
2014/01/29 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
新品发布会策划方案
2014/06/08 职场文书
个人授权委托书
2014/09/15 职场文书
商超业务员岗位职责
2015/02/13 职场文书
医德医风学习心得体会
2016/01/25 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
导游词之山海关
2019/12/10 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript