1.PHP中序列化变量的四种方法
序列化是将变量转换为可以保存或传输的字符串的过程;反序列化是在适当的时候将这个字符串转换成原始变量。这两个过程的结合可以方便地存储和传输数据,这使得程序更容易维护。
1.序列化和非序列化函数
这两个函数通常用于在PHP中序列化和反序列化数据。
$a=数组(' a'='苹果',' b'='香蕉',' c'='椰子');//Serialize数组$ s=Serialize($ a);echo $ s;//输出结果:a:3: { s:13360 ' as:5:苹果’;s 33601:“b”;s:6:香蕉’;s 33601:“c”;s:7:椰子’;} echo ' br/br/';//反序列化$ o=反序列化($ s);print _ r($ o);当数组值包含双引号、单引号或冒号等字符时,反序列化后可能会出现问题。为了克服这个问题,一个巧妙的技术是使用base64_encode和base64_decode。
$ obj=array();//serialize $ s=base64 _ encode(serialize($ obj));//反序列化$ original=反序列化(base64 _ decode($ s));但是base64编码会增加字符串的长度。为了克服这个问题,它可以与gzcompression一起使用。
//定义函数my _ serialize($ obj){ return base64 _ encode(gzcompresss(serialize($ obj)),用于序列化对象;}//反序列化函数my _ deserize($ txt){ return deserize(gzun compress(base64 _ decode($ txt)));} 2.json_encode和json_decode
使用JSON格式的序列化和反序列化是一个不错的选择:
使用json_encode和json_decode格式的输出比序列化和反序列化格式快得多。JSON格式可读。JSON格式小于序列化返回的数据。JSON格式是开放和可移植的。其他语言也可以使用。$a=数组(' a'='苹果',' b'='香蕉',' c'='椰子');//Serialize数组$ s=JSON _ encode($ a);echo $ s;//输出结果:{'a' : '苹果',' b' : '香蕉',' c' : '椰子' } echo ' br/br/';//反序列化$ o=JSON _ decode($ s);在上面的例子中,json_encode的输出长度明显短于前面例子中的serialize。
3.var_export和eval
var_export函数将变量输出为字符串;Eval将字符串作为PHP代码执行,并将它们反序列化以获取原始变量的内容。
$a=数组(' a'='苹果',' b'='香蕉',' c'='椰子');//序列化数组$s=var_export($a,true);echo $ s;//输出结果:array ('a'=' apple ',' b'=' banana ',' c'='椰子',)echo ' br/br/';//反序列化eval ('$ my _ var=')。$ s . ';');print _ r($ my _ var);4.wddx_serialize_value和wddx反序列化
wddx_serialize_value函数可以序列化数组变量,并将它们作为XML字符串输出。
$a=数组(' a'='苹果',' b'='香蕉',' c'='椰子');//Serialize数组$ s=wddx _ Serialize _ value($ a);echo $ s;//输出结果(查看输出字符串的源代码):wddx数据包版本=' 1.0 '标头/data tructvar name=' a ' string ple/string/varvar name=' b ' string baana/string/varvar name=' c ' string cococnut/string/var/struct/data/wddxpacktecho ' br/br/';//反序列化$ o=wddx _反序列化($ s);print _ r($ o);//输出结果:array ([a]=apple [b]=香蕉1=椰子)可以看出,XML标签中的字符很多,导致这种格式的序列化仍然占用大量空间。
结论
上述所有函数在序列化数组变量时都可以正常执行,但应用于对象时就不同了。例如,json_encode序列化对象失败。反序列化对象时,非序列化和评估会有不同的效果。
php中序列化变量的3种方法
二、PHP四种序列化方案的横向比较
数据序列化是一个非常有用的功能。但是,从视觉上来说,很多人和我一样,第一次接触这种东西的时候,并不明白这种东西是干什么用的。反正老师说了。如果你真的听不懂,你应该先背诵。
事实上,序列化数据有两个功能:
便于传输和存储的方便存储如何理解呢?比如我们有个PHP对象或者一个PHP数组需要存储到数据库甚至文件中,这显然是不可能的,这个时候必须要将PHP对象或者PHP数组序列化后再执行存储操作。不过这将PHP数组序列化后存起来还能理解,这对象也能存储啊?这操作是否过于风骚?少年,这一点儿都不风骚。有些时候将对象直接存储起来,用的时候只需要简单的反序列化后就可以投产使用了,避免了new一次带来的性能耗费。
方便传输如何理解呢?其实序列化在传输中应用的相对更多更常见些许。最简单的一个例子,一个码前端的码了一个ajax找你给TA提供一个API,那么这个时候你俩得商量返回什么数据,比如json或者xml,甚至你俩自己作死约定私有数据格式。比如在一个比较典型的服务架构中,网关服务器和内部RPC服务器之间通过msgpack传递数据。这都是典型的序列化为了传输的典型应用案例。
这里的序列化概念可能更加广泛和通用,包括传统的serialize、json、msgpack、protobuf等等。(如果觉得序列化不是很严格,可以用encode代替;反序列化由解码代替。无论如何,我称之为序列化和反序列化。如果你真的觉得不舒服,你可以沿着网线把我砍倒!)。
事实上,从更高的层次来看,数据的序列化可以分为两种类型:
文本序列化,如json、serialize、xml等。以及msgpack、protobuf、节俭等。很常见。一般来说,测试序列化技术的性能指标有两个,一个是序列化速度,另一个是序列化数据的大小,自然序列化速度越快,序列化数据越小越好。目前,protobuf和msgpack等二进制序列化在速度和数据量上都优于文本序列化。不过话说回来,文本序列化可读性更强,你一眼就能看出数据内容是什么。
今天这里有四个具体的方案。这四种方案是简单、粗略和现成的类型。让我们分别测试一下,看看哪一个更适合我们。
参加会议的四位小伙伴:PHP内置的serialize,PHP内置的JSON解析器,PHP的JSON扩展,PHP的msgpack扩展。前三个是文本类型,而msgpack是二进制类型。
JSOND作为PHP内置的JSON解析器的高级版本,有传言称比内置的JSON解析器更快。作为扩展,该产品需要额外安装,附带地址:https://pecl.php.net/get/jsond-1.4.0.tgz.
Msgpack是bird brother等人制作的一套二进制序列化工具。口号是“它就像JSON .但是又快又小。”附地址:https://pecl.php.net/get/msgpack-2.0.2.tgz
1.serialize useserialize(),序列化方法。Unserialize(),反序列化该方法。
2.json用法json_encode(),有什么要说的吗?Json_decode(),有什么要说的吗?
3.jsond使用jsond_encode(),与json_encode()相同,后面有几个字母d。Jsond_decode(),就像json_decode()一样,后面跟几个字母d。
4.msgpack用法msgpack_pack(),序列化方法。Msgpack_unpack(),反序列化方法。
测试代码如下:
?php/故意搞了一个还算大的服务器端编程语言(专业超文本预处理器的缩写)数组,更容易看出差距来$ arr=array(array('uid'=22193123,' gender'='famale ',' username'='elarity ',' password'=md5('www123 '),' relation '=array(array(' uid '=22193123 ',' gender'='famale ',' username'='elarity ',' password'=md5('www123 '),),array(' uid '=22193123,' gender'='famale ',' username'='elarity ',' password md5('www123 ')、array('uid'=22193123 '、gender'='famale '、username'='elarity '、password'=md5('www123 ')、array(' uid '=221931111 //每种序列化方案都执行100000次$ counter=100000//json序列化方案,执行100000次回显PHP_EOL . PHP _ EOL$ start=微时间(真);for($ I=1;$ I=$ counter $ I){ $ JSON=JSON _ encode($ arr);} $ size=strlen($ JSON);$ end=微时间(真);$ cost _ time=$ end-$ start;echo 'json_encode :耗费时间为{$cost_time},数据体积为{$size} ' .PHP _ EOL//jsond序列化方案,执行100000次$ start=微时间(真);for($ I=1;$ I=$ counter $ I){ $ jsond=jsond _ encode($ arr);} $ size=strlen($ jsond);$ end=微时间(真);$ cost _ time=$ end-$ start;echo 'jsond_encode :耗费时间为{$cost_time},数据体积为{$size} ' .PHP _ EOL//序列化序列化方案,执行100000次$ start=微时间(真);for($ I=1;$ I=$ counter $ I){ $ serialize=serialize($ arr);} $ size=strlen($ serialize);$ end=微时间(真);$ cost _ time=$ end-$ start;“回声”序列化:耗费时间为{$cost_time},数据体积为{$size} ' .PHP _ EOL//msgpack序列化方案,执行100000次$ start=微时间(真);for($ I=1;$ I=$ counter $ I){ $ msg pack=msg pack _ pack($ arr);} $ size=strlen($ msg pack);$ end=微时间(真);$ cost _ time=$ end-$ start;echo 'msgpack耗费时间为: {$cost_time},数据体积为{$size} ' .PHP _ EOL回显PHP_EOL .PHP _ EOL将文件保存为test.php,然后PHP test.php执行,结果如下图所示:
总结一下:
jsond确实是要比数据快一些的总有刁民张嘴就来数据要比序列化()快序列化()数据体积确实大(因为还保留了数据类型说明)msgpack最佳?不知道昂,你们自己感受