如果你的網站MySQL數據庫的速度比較慢,你就需要看重網站的緩存了。用過 WordPress 的朋友都知道,它有一個插件叫 WP Super Cache, 可以將 WordPress 的頁面在第一次生成時儲存成靜態頁面,當再次請求這個頁面時,就省去了讀取數據庫的時間。這裡討論的就是這種技術。
第一個問題就是怎樣獲取 PHP 輸出的內容了。獲取輸出內容的原因很簡單,因為我們可以把輸出的內容儲存起來,當訪客再次光臨的時候就把事先存好的內容給他。
實現這些目的其實也同樣簡單。我們只要把函數 ob_start() 在內容輸出前調用,然後在所有內容輸出完成後調用 ob_get_contents() 獲取輸出的內容,再在此後調用 ob_end_flush() 表示結束就可以了,一個簡單的例子如下:
<?php ob_start(); ?> <p>在 PHP 標簽之外的輸出可以被記錄。</p> <?php echo '<p>我被記錄了。</p>' ?> <?php $cache = ob_get_contents(); ?> <?php /* 在這裡添加任何處理 $cache 的代碼 */ echo $cache; ?> <?php ob_end_flush(); ?>
程序運行結果:
在 PHP 標簽之外的輸出可以被記錄。 我被記錄了。 在 PHP 標簽之外的輸出可以被記錄。 我被記錄了。
可見,$cache變量保存了之前的輸出結果。就是說,我們可以通過cache來減少PHP的結果輸出。
有時我們有這樣的習慣,對於管理員是不啟用緩存的,而對游客則啟用緩存。這個時候,其實實現起來也比較簡單。我們可以自己編寫兩個函數 cache($id) 和 end_cache($id),分別表示緩存開始和緩存結束,然後代碼如下(這裡有三個函數省略了):
<?php function is_admin() { /* 該函數用於測試當前用戶是否是管理員,若是管理員則返回 true. */ } function show_cache($id) { /* 根據 $id 讀取並顯示緩存內容,若無緩存則返回 false. */ } function save_cache($id, $content) { /* 將標識符為 $id 的緩存,以內容 $content 儲存。 */ } function cache($id) { if (is_admin()) return false; if (show_cache($id)) return false; ob_start(); return true; } function end_cache($id) { if (is_admin()) return false; save_cache($id, ob_get_contents()); ob_end_flush(); return true; } ?>
有的時候,站點可能會根據需要,建立了專門為移動設備設計的頁面。那麼,這種情況下我們就應該將 $id 擴展一下。這種擴展有很多種方法,比如添加另一個參數,將移動設備的頁面存在不同於桌面設備的文件夾中,而這些頁面使用相同的 $id . 另外還有一種做法,就是將原來的 $id 與移動設備的 User-agent 糅合在一起,md5() 一下就可以了。我偏向於前面那種做法。當然肯定還有其它類似的做法,總之中心思想就是把緩存的標記 ($id) 設置成不一樣的東西,並且當用戶回來後還能區別得出它們,就可以了。
還有的時候,一個網站有多種用戶角色,可能要給相應的用戶相應的緩存。當然,只需遵循上面的原則。
ob_start() 和 ob_end_flush() 是遞歸處理的。也就是說,可以在調用 ob_end_flush() 之前,調用若干次 ob_start() . 例如:
<?php ob_start(); echo 'content1'.'<br />'; ob_start(); echo 'content2'.'<br />'; $output1 = ob_get_contents(); echo $output1.'<br />'; ob_end_flush(); $output2 = ob_get_contents(); echo $output2.'<br />'; ob_end_flush(); ?>
程序運行結果:
content1 content2 content2 content1 content2 content2
$output2 緩存前面的三次輸出。