程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用自帶的PHP函數輸出緩存

用自帶的PHP函數輸出緩存

編輯:關於PHP編程

如果你的網站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 緩存前面的三次輸出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved