no-image

PHP常用快取技術的總結

                                    

1、全頁面靜態化快取:將頁面全部生成為HTML靜態頁面,使用者訪問時直接訪問靜態頁面,不走PHP伺服器的解析流程。此種方式在CMS系統中比較常見,如dedecms。

實現方法:輸出快取

ob_start()--開啟“輸出控制緩衝”;

some code --要執行的程式碼;

$content=ob_get_contents()--返回“輸出緩衝區的內容”;

some code --使用file_put_contents()等函式將返回的資料寫入HTML檔案;

ob_clearn()--清空“輸出緩衝區”;

2、頁面部分快取:將頁面中不常變動的部分進行靜態化快取,而經常變化的部分不快取,最後組裝在一起顯示;可以使用類似ob_get_contents()的方式實現,也可以利用類似ESI之類的頁面片段快取策略,使其用來做動態頁面中相對靜態的片段部分的快取。該快取方式常用與商城中的商品頁。

3、資料快取:快取資料的一種方式。比如,商城中的某個商品資訊,當用商品id去請求時,就會得出包括店鋪資訊、商品資訊等資料,此時就可以將這些 資料快取到一個php檔案中,檔名包含商品id來建一個唯一標示;下一次有人想檢視這個商品時,首先就直接調這個檔案裡面的資訊,而不用再去資料庫查 詢;其實快取檔案中快取的就是一個php陣列之類;Ecmall商城系統裡面就用了這種方式;

4、查詢快取:根據查詢來進行快取。將查詢得到的資料快取在一個檔案中,下次遇到相同的查詢時,就直接先從這個檔案裡面調資料,不再去查資料庫;但此處的快取檔名可能就需要以查詢語句為基點來建立唯一標示.

注意:以上幾種快取方式都需要對快取的檔案設定一個有效時間,在這個時間內,相同的訪問會先取快取檔案的內容,超過有效時間後就重新從資料庫中獲取資料,並生成新的快取檔案。

5、記憶體式快取:使用redis,memcached等nosql資料庫設定PHP快取,通過快取查詢結果,來減少資料庫的訪問次數,從而提高網站的響應速度。

Memcachedmemcached是高效能的分散式記憶體快取伺服器。 一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、 提高可擴充套件性。

它就是將需要快取的資訊,快取到系統記憶體中,需要獲取資訊時,直接到記憶體中取;比較常用的方式就是 key–>value方式;

<?php 
     $memcachehost = '192.168.6.191';
     $memcacheport = 11211;
     $memcachelife = 60;
     $memcache = new Memcache;
     $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
     $memcache->set('key','快取的內容');
     $get = $memcache->get($key);       //獲取資訊
?>

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。類似的安裝好php擴充套件

// 初始化$cache = new Redis();

// 初始化$cache = new \Redis();
$cache->connect(CACHE_HOSTNAME, CACHE_PORT);
// 先檢查是否存在,然後寫入並設定有效時間
if($cache->exists($key)){  
    $cache->delete(CACHE_PREFIX . $key);
}
$cache->set(CACHE_PREFIX . $key, serialize($value));
$cache->expire(CACHE_PREFIX . $key, $expire);
// 讀取
$cache->get(CACHE_PREFIX . $key);

6、apache快取模組:apache安裝完以後,是不允許被cache的。如果外接了cache或squid伺服器要求進行web加速的話,就需要在htttpd.conf裡進行設定,當然前提是在安裝apache的時候要啟用mod_cache的模組。

安裝apache時:./configure –enable-cache –enable-disk-cache –enable-mem-cache

7、PHP APC快取擴充套件:使用PHP中的APC擴充套件來進行快取

     Php有一個APC快取擴充套件,windows下面為php_apc.dll,需要先載入這個模組,然後是在php.ini裡面進行配置:

[apc] 
     extension=php_apc.dll 
     apc.rfc1867 = on 
     upload_max_filesize = 100M 
     post_max_size = 100M 
     apc.max_file_size = 200M 
     upload_max_filesize = 1000M 
     post_max_size = 1000M 
     max_execution_time = 600 ;   每個PHP頁面執行的最大時間值(秒),預設30秒 
     max_input_time = 600 ;       每個PHP頁面接收資料所需的最大時間,預設60 
     memory_limit = 128M ;       每個PHP頁面所吃掉的最大記憶體,預設8M

// 寫入
apc_store(CACHE_PREFIX . $key, $value, $expire);
// 讀取
apc_fetch(CACHE_PREFIX . $key);
// 刪除
apc_delete(CACHE_PREFIX . $key);

8、Opcode

我們知道,php的執行流程可以用下圖來展示:

首先php程式碼被解析為Tokens,然後再編譯為Opcode碼,最後執行Opcode碼,返回結果;所以,對於相同的php檔案,第一次執行時 可以快取其Opcode碼,下次再執行這個頁面時,直接會去找到快取下的opcode碼,直接執行最後一步,而不再需要中間的步驟了。

比較知名的是XCache、Turck MM Cache、PHP Accelerator等。

關於PHP Opcode,鳥哥的部落格中有一篇詳解:http://www.laruence.com/2008/06/18/221.html


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}