日韩女人性开放免费视频|亚洲国产精品无码久久98|国产成人精品第一区二区免费|超碰国产人人做人人爽|久久无码高潮喷水亚洲

查看詳情

使用serialize/unserialize和json_encode/json_decode對(duì)數(shù)組變量進(jìn)行轉(zhuǎn)義后存儲(chǔ)的效率對(duì)比

PHP里面,有時(shí)候出于實(shí)際需求考慮,需要將某些信息以數(shù)組的方式進(jìn)行存儲(chǔ),甚至有時(shí)候介于數(shù)組、字符串兩者之間,很難確定是數(shù)組還是字符串,如果最終還需要將這些信息存儲(chǔ)到文件系統(tǒng)中,而且要保證正確無(wú)誤的存儲(chǔ)、讀取。能達(dá)到這種效果的有兩組函數(shù),分別是serialize/unserialize和json_encode/json_decode,其中,serialize是將數(shù)組序列化,變成字符串格式,而unserialize正好相反,是將序列化的字符串進(jìn)行反序列化,變成數(shù)組;而json_encode是將變量轉(zhuǎn)換成JSON格式的數(shù)據(jù),而json_decode則是將JSON格式的數(shù)據(jù)轉(zhuǎn)換為對(duì)象(數(shù)組、JSON等)。 以下就以上兩組函數(shù)的優(yōu)缺點(diǎn)簡(jiǎn)單作個(gè)對(duì)比。

前面已經(jīng)說(shuō)明了情況,不僅要對(duì)變量進(jìn)行轉(zhuǎn)義,還要將轉(zhuǎn)義后的內(nèi)容進(jìn)行存儲(chǔ)、讀取,經(jīng)過(guò)本人測(cè)試發(fā)現(xiàn),在對(duì)變量進(jìn)行轉(zhuǎn)義方面serialize/unserialize相比之下要比json_encode/json_decode高效一些,不過(guò),也沒(méi)有高得離譜,那么,對(duì)于大數(shù)據(jù)方面,二者就有比較大的區(qū)別了。

舉個(gè)例子,通過(guò)下面這段代碼,產(chǎn)生一個(gè)包含20萬(wàn)個(gè)(數(shù)組)元素的數(shù)組,
$module = [];
for($i=0;$i<200000;$i++){
 $module[$i] = ['SN'=>$S->doSN(),'str'=>$S->randChar(30)];
}
注:doSN()的作用是產(chǎn)生一個(gè)10位的訂單序列號(hào),randChar(30)是產(chǎn)生一個(gè)30位的隨機(jī)字符串,這兩個(gè)函數(shù)不是本次的重點(diǎn),不作詳解。

通過(guò)前面的代碼對(duì)$module數(shù)組進(jìn)行賦值,接下來(lái)就是對(duì)數(shù)組進(jìn)行轉(zhuǎn)義了,實(shí)際操作發(fā)現(xiàn),serialize($module)時(shí)會(huì)報(bào)錯(cuò),“Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 14684160 bytes) in ”,如下圖:
使用serialize對(duì)大數(shù)組進(jìn)行操作時(shí)報(bào)Allowed memory size錯(cuò)


大概的意思是內(nèi)存超過(guò)了系統(tǒng)允許的14684160B,當(dāng)然也可以修改PHP.INI來(lái)加大。而json_encode($module)就不存在這個(gè)問(wèn)題,雖然說(shuō)筆者沒(méi)有繼續(xù)測(cè)試下去看看json_encode會(huì)不會(huì)也出現(xiàn)內(nèi)存溢出的情況,但是,就目前的情況來(lái)說(shuō),json_encode似乎要更強(qiáng)大一點(diǎn)。

好了,接著測(cè)試另一種情況,“容錯(cuò)”,這里的容錯(cuò)指的是當(dāng)無(wú)法判斷需要轉(zhuǎn)義/反轉(zhuǎn)義的變量是數(shù)組還是字符串的情況,如下:

$str = 'PHP'; //簡(jiǎn)單的定義一個(gè)字符串變量,
serialize($str)得到的結(jié)果是s:3:"PHP";
json_encode($str)得到的結(jié)果是"PHP";
都沒(méi)有報(bào)錯(cuò),同樣的,我們看下反轉(zhuǎn)義的。
unserialize($str)出錯(cuò)了,Notice: unserialize(): Error at offset 0 of 3 bytes in
使用unserialize對(duì)字符串進(jìn)行操作報(bào)錯(cuò)

json_decode($str)沒(méi)有報(bào)錯(cuò),返回值是NULL,這個(gè)好理解,畢竟前面的$str中的內(nèi)容不是一個(gè)有效的JSON格式數(shù)據(jù)。


到這里,大概的總結(jié)以下幾點(diǎn):
1、大數(shù)組情況下,JSON組函數(shù)要更耐用;
2、對(duì)未知類型的變量進(jìn)行反轉(zhuǎn)義時(shí),JSON組函數(shù)容錯(cuò)性要更理想;
3、相比而言,JSON組函數(shù)轉(zhuǎn)義后的字符串要更短一些,作為文件存儲(chǔ),可以節(jié)約一定的存儲(chǔ)空間。


順便,對(duì)serialize和json_encode的效率進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比,

 $stime = time();
 for($i=0;$i<200000;$i++){
  serialize(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);
 }
 echo '<br><br>進(jìn)行20萬(wàn)次serialize運(yùn)算花費(fèi)' . (time()-$stime) . '秒';

 $stime = time();
 for($i=0;$i<200000;$i++){
  json_encode(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);
 }
 echo '<br><br>進(jìn)行20萬(wàn)次json_encode運(yùn)算花費(fèi)' . (time()-$stime) . '秒';

serialize和json_encode的對(duì)比結(jié)果

通過(guò)上面的對(duì)比發(fā)現(xiàn),20萬(wàn)次同樣的操作,serialize比json_encode快1秒,這樣算下來(lái),單次執(zhí)行而言二者基本上是不相上下了。


原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處:網(wǎng)站建設(shè),APP開(kāi)發(fā),小程序開(kāi)發(fā)請(qǐng)找江西居道科技有限公司,http://www.shanghai143.cn

智能建站系統(tǒng)代理招商
所屬分類:文章中心??????Time:2016-11-04 07:08:00??????人氣:2325
關(guān)閉
13517086454