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 相关文章推荐
Email+URL的判断和自动转换函数
Oct 09 PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 PHP
php中字符串和正则表达式详解
Oct 23 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
php运行时动态创建函数的方法
Mar 16 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
React实现全选功能
2020/08/25 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python杀死一个线程的方法
2015/09/06 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
什么是反射?如何实现反射?
2016/07/25 面试题
会计专业毕业生求职信分享
2014/01/03 职场文书
社区健康教育实施方案
2014/03/18 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
体育部部长竞选稿
2015/11/21 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Python可视化学习之seaborn调色盘
2022/02/24 Python
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript