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 相关文章推荐
array_multisort实现PHP多维数组排序示例讲解
Jan 04 PHP
php实现rc4加密算法代码
Apr 25 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
php时间戳转换的示例
Mar 31 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
php识别翻转iphone拍摄的颠倒图片
May 17 PHP
php实现数字补零的方法总结
Sep 12 PHP
Laravel框架表单验证操作实例分析
Sep 30 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 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 MVC框架skymvc支持多文件上传
2016/05/26 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
详解vue-router和vue-cli以及组件之间的传值
2017/07/04 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
python提取内容关键词的方法
2015/03/16 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
Ibatis如何使用动态表名
2015/07/12 面试题
法学专业毕业生自荐信
2014/06/11 职场文书
法学自荐信
2014/06/20 职场文书
新店开张活动方案
2014/08/24 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
建党伟业观后感
2015/06/01 职场文书
战友聚会致辞
2015/07/28 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python