当前位置: 首页 > 后端技术 > PHP

PHP四种序列化方案

时间:2023-03-30 03:03:19 PHP

原文地址:https://t.ti-node.com/thread/...数据的序列化是一个非常有用的功能,但是很多人和我一样,只是在接触的时候有了这个东西,我根本不明白它是干什么用的。反正是老师说的,实在听不懂还是先背吧。“什么狗屁,这是序列化和反序列化……”(图片来自国军二手商米龙,《我的团长我的团》的双人演员)。其实序列化数据有两个作用:方便传输、方便存储、方便存储。怎么理解呢?比如我们有一个PHP对象或者PHP数组需要存储在数据库甚至文件中。这显然是不可能的。这时,PHP对象或PHP数组必须先序列化,然后再执行存储操作。不过序列化后存放PHP数组还是可以理解的,这个对象也可以存放?这操作是不是太骚了?小子,这根本就不是撒娇。有时直接存储对象,使用时简单反序列化后即可投入生产,避免了newonce带来的性能消耗。如何理解传输的便利性?事实上,序列化在传输应用中相对越来越普遍。最简单的例子,一个代码前端写了一个ajax,让你提供一个API给TA。那么这个时候你们两个就得商量一下返回什么数据,比如json或者xml,甚至自己约定一个私有的数据格式。例如,在一个典型的服务架构中,数据通过msgpack在网关服务器和内部RPC服务器之间传输。以上就是传输序列化的典型应用案例。这里的序列化的概念可能比较广泛和笼统,包括传统的serialize、json、msgpack、protobuf等(如果觉得序列化这个词不太严谨,可以用encode代替;反序列化可以用decode代替。反正,我会用所有的序列化和反序列化来调用它,如果你觉得实在不舒服,你可以沿着网线黑我!)。其实从更高的层次上,数据序列化可以分为两种:文本序列化,常见的二进制序列化如json、serialize、xml,常见的如msgpack、protobuf、thrift等。一般来说,测试序列有序列化技术的两个性能指标,一个是序列化速度,另一个是序列化数据的大小。自然是序列化速度越快,序列化后的数据越小越好。目前protobuf、msgpack等二进制序列化在速度和数据量上都优于文本序列化。不过话说回来,文本序列化的可读性更好,一眼就能看出数据内容大概是什么。今天带来了四种具体的解决方案。这四种解决方案简单且开箱即用。下面我们分别测试感受一下,看看哪一款更适合我们。参会的四位哥们:PHP内置serialize、PHP内置JSON解析器、PHP扩展JSOND、PHP扩展msgpack。其中,前三个是文本类型,msgpack是二进制类型。JSOND是PHP内置JSON解析器的高级版本。据说速度比内置的快。作为扩展,此产品需要额外安装。附地址:https://pecl.php.net/get/json...msgpack是鸟哥等人开发的一套二进制序列化工具。口号是“它就像JSON,但又快又小”。附地址:https://pecl.php.net/get/msgp...serialize用法serialize(),序列化方法。unserialize(),反序列化方法。json的用法json_encode(),没什么好说的吧?json_decode(),没什么好说的吧?jsond使用的是jsond_encode(),和json_encode()是一样的,只是后面多了几个字母d。jsond_decode(),和json_decode()一样,只是后面几个字母d。msgpack用法msgpack_pack(),序列化方法。msgpack_unpack(),反序列化方法。测试代码如下:22193123,'gender'=>'famale','用户名'=>'elarity','密码'=>md5('www123'),'关系'=>array(array('uid'=>22193123,'性别'=>'女','用户名'=>'elarity','password'=>md5('www123'),),array('uid'=>22193123,'gender'=>'famale','username'=>'elarity','password'=>md5('www123'),),array('uid'=>22193123,'性别'=>'女性','用户名'=>'elarity','密码'=>md5('www123'),),array('uid'=>22193123,'gender'=>'famale','username'=>'elarity','password'=>md5('www123'),),array('uid'=>22193123,'性别'=>'女','用户名'=>'elarity','密码'=>;md5('www123'),),array('uid'=>22193123,'性别'=>'女性','用户名'=>'elarity','密码'=>md5('www123'),),array('uid'=>22193123,'gender'=>'famale','username'=>'elarity','password'=>md5('www123'),),array('uid'=>22193123,'性别'=>'女性','用户名'=>'elarity','密码'=>md5('www123'),),array('uid'=>22193123,'性别'=>'女性','username'=>'elarity','password'=>md5('www123'),),),));//每个序列化方案执行100000次$counter=100000;//JSON序列化方案,执行100000次次echoPHP_EOL.PHP_EOL;$start=microtime(true);for($i=1;$i<=$counter;$i++){$json=json_encode($arr);}$size=strlen($json);$end=microtime(true);$cost_time=$end-$start;echo"json_encode:花费的时间为{$cost_time},数据大小为{$sizee}".PHP_EOL;//jsond序列化方案,执行100000次$start=microtime(true);for($i=1;$i<=$counter;$i++){$jsond=jsond_encode($arr);}$size=strlen($jsond);$end=microtime(true);$cost_time=$end-$start;echo"jsond_encode:花费时间为{$cost_time},数据量为{$size}".PHP_EOL;//serialize序列化方案,执行100000次$start=microtime(true);for($i=1;$i<=$counter;$i++){$serialize=serialize($arr);}$size=strlen($serialize);$end=microtime(true);$cost_time=$end-$start;echo"serialize:花费的时间为{$cost_time},数据量为{$size}".PHP_EOL;//msgpack序列优化scheme,执行100000次$end=microtime(true);$cost_time=$end-$start;echo"msgpack花费时间:{$cost_time},数据大小为{$size}".PHP_EOL;echoPHP_EOL.PHP_EOL;将文件保存为测试。PHP和n执行phptest.php,结果如下图:总结一下:jsond确实比json快,总有人张嘴说json比serialize()serialize()数据量快真的很大(因为还保留了数据类型描述)msgpack最好???不知道昂,你可以补充一下自己的感受:评论里有一个很好的补充,在这里指出我一些片面的内容,你可以加进去观看:“你可以看看我的测试:https://blog.yurunsoft.com/a/...我选择了很多数据类型,比如数组和对象,小数据和多数据,其实说哪个好是没有意义的而且速度更快。需要根据实际场景选择合适的。good”