亚洲国产精品欧美综合|婷婷五月无码中文有码|欧美系列国产一区二区|美女AV一区二区三区

查看詳情

使用serialize/unserialize和json_encode/json_decode對數組變量進行轉義后存儲的效率對比

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

前面已經說明了情況,不僅要對變量進行轉義,還要將轉義后的內容進行存儲、讀取,經過本人測試發現,在對變量進行轉義方面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秒,這樣算下來,單次執行而言二者基本上是不相上下了。


原創內容,轉載請注明出處:網站建設,APP開發,小程序開發請找江西居道科技有限公司,http://xhjnt.cn

智能建站系統代理招商
所屬分類:文章中心??????Time:2016-11-04 07:08:00??????人氣:2272
關閉
13517086454