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 中文处理函数集合
Aug 27 PHP
php中取得URL的根域名的代码
Mar 23 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
百度地图API使用方法详解
Aug 25 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 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中的生成XML文件的4种方法分享
2012/10/06 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
php中stream(流)的用法
2014/03/25 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
Redux实现组合计数器的示例代码
2018/07/04 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
使用Python生成随机密码的示例分享
2016/02/18 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
python读取oracle函数返回值
2016/07/18 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
英语系本科生个人求职信
2013/09/21 职场文书
死者家属慰问信
2015/03/24 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技