PHP常用緩存方式:
第一種,把需要緩存的數據進行處理,形成PHP可以直接執行的文件。在需要緩存數據的時候,通過include方式引入,並使用。
第二種,把需要的數據通過serialize函數序列化后直接保存到文件。在需要使用緩存數據的時候,通過反序列化讀入文件內容並復制給需要的變量,然后使用。
測試結果:
通過測試我們發現,第二種也就是serialize緩存數據的方式更加高效。(數據略去,最后提供了文章地址下載,大家可以自行測試)
原因分析:
include方式讀取緩存的時候,PHP需要執行幾個過程
1.讀取文件
2.解析所Include的文件
3.執行,給變量賦值
而serialize序列化方式讀取緩存的時候:
1.讀取數據
2.反序列化數據內容
3.給變量賦值
總結分析:
第一種,include緩存的方式
優點:增加數據的保密性,和安全性,緩存內容不會被外界發現。
缺點:速度相對較慢。
用途:保存禁止系統外部得知的數據,比如web系統的設置,甚至MySQL信息等的保存
第二種,serialize序列化緩存的方式
優點:速度較快,可處理除了resource之外的任何類型,特別是對象的存儲,這是其存在的意義(json_encode()無法處理對象方法等數據)。
缺點:緩存系統文件路徑一旦曝光,緩存內容會泄露。
用途:緩存最新文章,相關文章等不擔心外部得知的數據的時候,可以使用這種方式。
PHP文件緩存內容保存格式主要有三種:
(1)變量 var_export 格式化成PHP正常的賦值書寫格式;
(2)變量 serialize 序列化之后保存,用的時候反序列化;
(3)變量 json_encode格式化之后保存,用的時候json_decode;
互聯網上測試結果是:serialize格式的文件解析效率大於Json,Json的解析效率大於PHP正常賦值。
所以我們要是緩存數據建議采用序列化的形式解析數據會更快。
注意:json只有四種類型,並且是以簡單的符號表示,而serialize有更加詳細的類型區分。 json無法處理對象方法等數據,因此序列化對象要用serialize()。
與對象無關的數據存儲可以使用json,如包含大量數字的數組等,而對象的存儲要用serialize,這是其存在的意義。
serialize()可處理除了resource之外的任何類型。
$data=[]; for($i=1;$i<10;$i++){ $data[]=['id'=>$i,'title'=>'title '.$i]; } $redis = new Redis(); $redis->connect('127.0.0.1'); $redis->set('data', serialize($data)); // 使用serialize序列化數據為字符串 $data2 = unserialize($redis->get('data')); // 反序列化字符串為數據 var_export($data2);
resource類型的資源只能用$GLOBALS緩存
class dbutil { protected $link = null; public function connect($host, $user, $password, $database = '') { $this->link = mysqli_connect($host, $user, $password, $database, 3306); } public function query($sqlstmt) { $result = $this->link->query($sqlstmt); $out = []; while ($row = mysqli_fetch_row($result)) { $out[] = $row; } return $out; } } $dbutil = new dbutil(); $dbutil->connect('127.0.0.1', 'root', 'root', 'chaoyue'); $list = $dbutil->query('select * from fanwe_user limit 1'); var_export($list); echo '<hr />'; //$GLOBALS['db']=$dbutil; // $GLOBALS普通賦值方法 $GLOBALS += ['db2' => $dbutil]; // $GLOBALS另一種賦值方法 $list2 = $GLOBALS['db2']->query('select * from fanwe_user limit 1'); var_export($list2); exit;
參考文章:
php apc緩存以及與redis的對比 (http://blog.csdn.net/w18704622664/article/details/47132061)
Redis數據存儲解決方案 (http://www.cnblogs.com/fvsfvs123/p/4319240.html)
Redis 與 數據庫處理數據的兩種模式 (http://www.veryhuo.com/a/view/9266.html)
Redis內存使用優化與存儲 (http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage)
Redis復制與可擴展集群搭建 (http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster)
redis緩存隊列+MySQL +php任務腳本定時批量入庫 (http://www.cnblogs.com/shijy-1990/p/5920841.html)
PHP讀取大文件 (http://www.cnblogs.com/DavidYan/articles/2496235.html)
讓php讀取文件不在受內存限制 (http://www.71j.cn/archives/88)
PHP中文件緩存轉內存緩存的方法 (http://www.jb51.net/article/29068.htm)
PHP 文件緩存的性能測試 (http://www.jb51.net/article/23206.htm)
PHP中加速、緩存擴展的區別和作用詳解(eAccelerator、memcached、xcache、APC) (http://www.jb51.net/article/88281.htm)
PHP文件緩存內容保存格式實例分析 (http://www.jb51.net/article/54046.htm)
PHP5+引進$GLOBALS延遲初始化的概念 (http://blog.csdn.net/billfeller/article/details/8517746)
$GLOBALS與global區別 & 變量銷毀機制 (http://blog.csdn.net/u013372487/article/details/72085692)
Redis 命令參考 (http://redisdoc.com/)
版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。 |