1. 程式人生 > 實用技巧 >PHP的幾種快取總結

PHP的幾種快取總結

為什麼80%的碼農都做不了架構師?>>> hot3.png

PHP的快取大概有幾種吧,頁面靜態式、伺服器端模組式、記憶體式、檔案資料式、按內容變更進行快取。現在一一梳理總結一下。

頁面靜態式

1.全頁面靜態化快取

也就是將頁面全部生成html靜態頁面,使用者訪問時直接訪問的靜態頁面,而不會去走php伺服器解析

的流程。此種方式,在CMS系統中比較常見,比如dedecms;

一種比較常用的實現方式是用輸出快取:

Ob_start()
******要執行的程式碼*******
$content = Ob_get_contents();
****將快取內容寫入html檔案*****
Ob_end_clean();

2.頁面部分快取

該種方式,是將一個頁面中不經常變的部分進行靜態快取,而經常變化的塊不快取,最後組裝在一起顯示;可以使用類似於ob_get_contents 的方式實現,也可以利用類似ESI之類的頁面片段快取策略,使其用來做動態頁面中相對靜態的片段部分的快取

任何一個Web網站的內容都是在不斷更新和變化,但這並不意味這這個網站的內容就是動態內容,事實上,動態的內容是指使用者每次點選 相同的連結時取的的內容是由Web伺服器應用程式生成的,如常見得ASP,JSP等,與此相對應,靜態內容一般就是指由文字、影象和多媒體組成,在使用者每 次單擊相應連結時基本保持不變。現在解決動態內容快取的最新技術就是通過ESI技術來設計網站的內容。

伺服器端模組式

1.apache快取模組

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

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

2.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

3.Opcode快取

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

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

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

記憶體式

1.Memcached快取

memcached是高效能的分散式記憶體快取伺服器。 一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態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); //獲取資訊?>

2.Redis快取

Redis的簡單使用,連線、開啟和命令模式。

檔案資料式

1.資料快取

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

Ecmall商城系統裡面就用了這種方式;

2.查詢快取

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

按時間變更進行快取

其實,這一條不是真正的快取方式;上面的2、3、4的快取技術一般都用到了時間變更判斷;就是對於快取檔案您需要設一個有效時間,在這個有效時間 內,相同的訪問才會先取快取檔案的內容,但是超過設定的快取時間,就需要重新從資料庫中獲取資料,並生產最新的快取檔案;比如,我將我們商城的首頁就是設 置2個小時更新一次;

3.檔案快取

HTML檔案快取、PHP類和檔案快取

按內容變更進行快取

這個也並非獨立的快取技術,需結合著用;就是當資料庫內容被修改時,即刻更新快取檔案;

比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面快取;

當商家在後臺修改這個商品的資訊時,點選儲存,我們同時就更新快取檔案;那麼,買家訪問這個商品資訊時,實際上訪問的是一個靜態頁面,而不需要再去訪問資料庫;

試想,如果對商品頁不快取,那麼每次訪問一個商品就要去資料庫查一次,如果有10萬人線上瀏覽商品,那伺服器壓力就大了;

DNS快取

即快取DNS伺服器。BIND是最廣泛使用的開源名稱伺服器在RHEL中 , 通過bind軟體包提供防火牆開啟埠53/TCP和53/UDPBIND的主配置檔案是/etc/named.conf/var/named目錄包含名稱伺服器所使用的其他資料檔案。

HTTP快取

即設定HTTP快取頭。對於PHP輸出的內容,如果不是需要經常變動的內容(例如偽靜態的一些頁面,PHP輸出JS或者CSS),使用PHP合理設定HTTP響應頭新增快取設定,讓瀏覽器儘可能快取下內容,在重新整理和再次訪問同樣內容時,便不需要再次請求瀏覽器,從而能夠大幅減少伺服器的響應次數,同時瀏覽器呈現頁面也會加快了,這是非常有用的一個技巧。

1、輸出Cache-Control頭:header('Cache-Control:max-age=120');
這個的輸出是表明讓瀏覽器快取120秒。這個指令很有用,但是侷限性在於,重新整理這個頁面時還是會重新請求,所以你會感覺這個頭好像沒什麼作用,但是對於一些輸出的JS、CSS內容時是有用的,也就是說你重新整理的頁面不是它本身,而只是引用了設定有此頭的PHP檔案的話,它就會在你指定的時間內從本地快取中讀取內容而不會請求伺服器。同時通過超連結過來的已經請求過的頁面時,你也會看到瀏覽器從本地cache裡讀取而不用通過伺服器。

2、更高階玩法:通過設定Last-Modified、Expires頭設定快取
如下面這段程式碼


<?php
$interval=120; //2分鐘
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
// HTTP_IF_MODIFIED_SINCE即下面的: Last-Modified,文件快取時間.
// 快取時間+時長.
$c_time = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$interval;
// 當大於當前時間時, 表示還在快取中... 釋放304
if($c_time > time()){
header('HTTP/1.1 304 Not Modified');
exit();
}
}
header('Cache-Control:max-age='.$interval);
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$interval)." GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
echo ' - <a href="">點選重新載入本頁面</a><br />';
當瀏覽器首次訪問時,請求頭不會帶HTTP_IF_MODIFIED_SINCE這個東西,所以我們就設定了三個頭。一個就是剛才第1點,Cache-Control頭,告訴讓瀏覽器自己快取個120秒。
第二個頭Expires是表明,在當前時間的120秒後快取失效,瀏覽器會在120秒後把快取失效,再次請求時會到伺服器端請求而不是本地。
第三個頭Last-Modified則是說明這個文件最後修改時間。可以看出輸出的當前時間。
當瀏覽器再次訪問時(重新整理頁面),瀏覽器因為在第一次時接收到了Last-Modified,它便會根據這個時間去檢查伺服器的文件是否更新過,也就是會把這個時間用HTTP_IF_MODIFIED_SINCE這個東西帶過去,於是也就有了第一個花括號內容的判斷。而花括號內再次根據這個時間加上你設定的時間(120秒),看看是不是超出了當前的時間time(),如果超出了,那就是還在快取期內,幫直接返回304,然後直接退出。這時候瀏覽器便會自動用快取的內容。這樣子做,伺服器返回的內容就很短,只是一個304響應頭而已,而內容不需要返回,這可大大節省網路流量,顯然瀏覽器的響應速度也會感覺明顯快了。

按F5重新整理或者按瀏覽器的重新整理按鈕時,你將發現2分鐘內你的PHP請求將是304狀態返回。
強制重新整理(CTRL+F5)時,瀏覽器不會帶HTTP_IF_MODIFIED_SINCE這個東西去判斷,所以同正常瀏覽一樣,返回200狀態。這個邏輯是正常的,因為強制重新整理本就相當於完全請求一遍最新內容。

瀏覽器頭中的快取設定雖然技巧雖小,但是在web應用中非常有用。合理利用瀏覽器的快取,儘量避免重複內容的請求,一個頁面少了幾十KB的請求,流量大的網站一天能夠節省幾百M甚至幾G的網路流量。這對提升使用者體驗來說也是一個相當重要的設定項。

轉載於:https://my.oschina.net/Shinsg/blog/1579744