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 12 PHP
深入解析php中的foreach问题
Jun 30 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 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文件读写操作之文件写入代码
2011/01/13 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
js对象数组和对象的使用实例详解
2019/08/27 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
mysql 之通过配置文件链接数据库
2017/08/12 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Python多线程原理与用法详解
2018/08/20 Python
ipython和python区别详解
2019/06/26 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
Python新手学习raise用法
2020/06/03 Python
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
应聘教师推荐信
2013/10/31 职场文书
员工薪酬福利制度
2014/01/17 职场文书
小学科学教学反思
2014/01/26 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
2015年个人实习工作总结
2015/05/28 职场文书