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 相关文章推荐
模仿OSO的论坛(五)
Oct 09 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
php define的第二个参数使用方法
Nov 04 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
Laravel实现构造函数自动依赖注入的方法
Mar 16 PHP
php中二分法查找算法实例分析
Sep 22 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
PHP常用函数之根据生日计算年龄功能示例
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+jQuery 注册模块开发详解
2014/10/14 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python常见数制转换实例分析
2015/05/09 Python
Python Matplotlib库入门指南
2015/05/18 Python
全面理解Python中self的用法
2016/06/04 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
python版大富翁源代码分享
2018/11/19 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
Python银行系统实战源码
2019/10/25 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
在购买印度民族服饰:Soch
2020/09/15 全球购物
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
挂职个人工作总结
2015/03/05 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
离婚被告代理词
2015/05/23 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server