使用serialize/unserialize和json_encode/json_decode对数组变量进行转义后存储的效率对比

19-12-26    1031次

      PHP里面,有时候出于实际需求考虑,需要将某些信息以数组的方式进行存储,甚至有时候介于数组、字符串两者之间,很难确定是数组还是字符串,如果最终还需要将这些信息存储到文件系统中,而且要保证正确无误的存储、读取。能达到这种效果的有两组函数,分别是serialize/unserialize和json_encode/json_decode,其中,serialize是将数组序列化,变成字符串格式,而unserialize正好相反,是将序列化的字符串进行反序列化,变成数组;而json_encode是将变量转换成JSON格式的数据,而json_decode则是将JSON格式的数据转换为对象(数组、JSON等)。 以下就以上两组函数的优缺点简单作个对比。                                                                                  timg (5).jpg                                                                          


前面已经说明了情况,不仅要对变量进行转义,还要将转义后的内容进行存储、读取,经过本人测试发现,在对变量进行转义方面serialize/unserialize相比之下要比json_encode/json_decode高效一些,不过,也没有高得离谱,那么,对于大数据方面,二者就有比较大的区别了。


举个例子,通过下面这段代码,产生一个包含20万个(数组)元素的数组,

$module = [];

for($i=0;$i<200000;$i++){

 $module[$i] = ['SN'=>$S->doSN(),'str'=>$S->randChar(30)];

}

注:doSN()的作用是产生一个10位的订单序列号,randChar(30)是产生一个30位的随机字符串,这两个函数不是本次的重点,不作详解。


通过前面的代码对$module数组进行赋值,接下来就是对数组进行转义了,实际操作发现,serialize($module)时会报错,“Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 14684160 bytes) in ”,如下图:

使用serialize对大数组进行操作时报Allowed memory size错



大概的意思是内存超过了系统允许的14684160B,当然也可以修改PHP.INI来加大。而json_encode($module)就不存在这个问题,虽然说笔者没有继续测试下去看看json_encode会不会也出现内存溢出的情况,但是,就目前的情况来说,json_encode似乎要更强大一点。


好了,接着测试另一种情况,“容错”,这里的容错指的是当无法判断需要转义/反转义的变量是数组还是字符串的情况,如下:


$str = 'PHP'; //简单的定义一个字符串变量,

serialize($str)得到的结果是s:3:"PHP";

json_encode($str)得到的结果是"PHP";

都没有报错,同样的,我们看下反转义的。

unserialize($str)出错了,Notice: unserialize(): Error at offset 0 of 3 bytes in 

使用unserialize对字符串进行操作报错


json_decode($str)没有报错,返回值是NULL,这个好理解,毕竟前面的$str中的内容不是一个有效的JSON格式数据。



到这里,大概的总结以下几点:

1、大数组情况下,JSON组函数要更耐用;

2、对未知类型的变量进行反转义时,JSON组函数容错性要更理想;

3、相比而言,JSON组函数转义后的字符串要更短一些,作为文件存储,可以节约一定的存储空间。



顺便,对serialize和json_encode的效率进行一个简单的对比,


 $stime = time();

 for($i=0;$i<200000;$i++){

  serialize(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);

 }

 echo '<br><br>进行20万次serialize运算花费' . (time()-$stime) . '秒';


 $stime = time();

 for($i=0;$i<200000;$i++){

  json_encode(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);

 }

 echo '<br><br>进行20万次json_encode运算花费' . (time()-$stime) . '秒';


serialize和json_encode的对比结果


通过上面的对比发现,20万次同样的操作,serialize比json_encode快1秒,这样算下来,单次执行而言二者基本上是不相上下了。




以上【 使用serialize/unserialize和json_encode/json_decode对数组变量进行转义后存储的效率对比 】的内容由达设互动(http://www.szdashe.com)为您提供,本文网址 : http://www.szdashe.com/wangzhanjianshezhishi/217.html ,转载请注明出处!更多有关深圳网站建设,微信小程序、电商平台建设、系统开发等互联网应用服务都可以联系我们。热线:130 7784 6582

扫描二维码微信聊天

在线咨询
联系电话

130 7784 6582