程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP Cache緩存機制與文件緩存原理

PHP Cache緩存機制與文件緩存原理

編輯:PHP綜合

PHP Cache緩存機制與文件緩存原理,使用 PEAR 中的 cache 可以將內容緩存於文件,數據庫或者內存中,以文件為例。

沒有使用緩存

pear_content_cache1.php

 

<?php 
    echo "這是內容。<P>"; 
    echo "當前時間是" . date('M-d-Y H:i:s A', time()) . "<BR>"; 
?>

為其加上緩存

pear_content_cache2.php

<?php
    require_once 'Cache/Output.php';
    //設置緩存目錄,必須是可寫的
    $cacheDir = './pear_cache';
    $cache = new Cache_Output('file',array('cache_dir' => $cacheDir));
    //如果nocache變量為空,使用緩存中的內容
    //如果想獲得最新的內容,就要賦值給nocache變量
   if (empty($_REQUEST['nocache']))
 {
  // 建立一個獨一的cache標識
  // 請求+Cookie信息
  $cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));
 }
 else
 {
   //想獲得最新的內容,ID為空
   $cache_id = null;
 }
 //看cache ID對應的緩存內容是否可用
 if ($content = $cache->start($cache_id))
 {
  //緩存已存在,直接輸出,並結束腳本
  echo $content;
  exit();
 }
 // 緩存中不存在該內容,生成新內容並寫入緩存
 echo "這是內容。<P>";
 echo "當前時間是" . date('M-d-Y H:i:s A', time()) . "<BR>";
 // 把內容寫入緩存
 echo $cache->end();
?>

分別刷新這兩個文件,你會發現 pear_content_cache1.php 中的“當前時間是”這一行中的時間是隨著刷新而變化的,而 pear_content_cache2.php 中的這一行則不變。

 

這是由於 pear_content_cache2.php 使用了緩存,將用戶請求的內容存入靜態文件中。當用戶再次請求時,它直接從文件中輸出,而不需要用程序動態生成內容。

對於 pear_content_cache2.php ,如果用戶想要讀取最新的信息,而不是緩存中成舊的信息。那麼可以用http.//… /pear_content_cache2.php?nocache=1 來訪問,這將禁用緩存功能,刷新一下看看,你將發現時間會隨之變化。

總結PEAR內容緩存類的使用:

1、包含 PEAR 包 要注意路徑。

2、包含Output.php中的cache類

 

 

require_once 'Cache/Output.php';

 

3、設置緩存目錄

 

$cacheDir = './pear_cache'; 

 

 

確認這個目錄是可寫的,Cache數據將會寫入這個目錄的子目錄中。

4、建立一個輸出緩存對象

 

$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));

 

第一個參數表示我們使用基於“文件”方式的緩存,第二個參數是一個與緩存目錄相關聯的數組。

5、產生一個唯一的cache ID

 

$cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));

 

這裡 $cache 對象的 generateID() 方法通過提供一個信息數組 (URL, HTTP POST data, 和 HTTP cookie) 來獨一無二地標識這個請求,與其它請求區分開來。

6、增加一個邏輯判斷語句看是否對應於cacheID的緩存數據是否已經存在,如果存在,獲取數據並結束腳本。

 

if ($content = $cache->start($cache_id)) 

    echo $content; 
    exit(); 
}

 

7、將產生內容的代碼放在以上邏輯語句之後,並結束使用cache對象。

 

echo $cache->end();

 

函數緩存輸出 PEAR cache

PEAR除了可以對輸出的內容進行緩存處理外,還可以將對某個函數的調用結果緩存起來。這是個很有趣的功能,如果你的程序要頻繁使用到某個函數,而且調用的結果相同的話,我建議你不妨試試,特別是當這個函數運行起來比較慢的時候。

 下面我們實現對一個執行起來很慢的函數 slowFunction() 的緩沖調用。

<?php
 require_once 'Cache/Function.php';
 $cacheDir = './pear_cache/';
 $cache = new Cache_Function('file',array('cache_dir' => $cacheDir));
 $arr = array('東方', '南方','西方');
 $cache->call('slowFunction', $arr);
 echo '<BR>';
 $arr = array('東方', '南方','西方');
  slowFunction($arr);
 function slowFunction($arr = null)
 {
  echo "執行起來很慢的函數 :( <br>";
  echo "當前時間是 " . date('M-d-Y H:i:s A', time()) . '<br>';
  foreach ($arr as $fruit)
  {
   echo "太陽此時正在 $fruit <br>";
  }
 )
?>

以下是示例的腳本執行結果:

執行起來很慢的函數:

  • 當前時間是 Jul-28-2010 17:15:57 PM
  • 太陽此時正在 東方
  • 太陽此時正在 南方
  • 太陽此時正在 西方

執行起來很慢的函數 :

  • 當前時間是 Jul-28-2010 17:17:55 PM
  • 太陽此時正在 東方
  • 太陽此時正在 南方
  • 太陽此時正在 西方

代碼中,Cache/Function.php 類用來執行函數緩沖功能,$cache變量是一個 Cache_Function 對象,使用基於文件的函數緩存,存入 $cacheDir 目錄。要緩存一個函數調用,Cache_Function 對象 $cache 的 call() 方法要像這樣使用:

$cache->call(‘slowFunction’, $arr);

這裡,slowFunction() 函數被調用,參數為一個數組 $arr ,這個函數被緩存在 $cacheDir 目錄下的一個文件裡。任何在此之後的對這個函數的調用,將會由 $cache->call() 返回該函數執行的結果。

$cache->call(‘slowFunction’, $arr);   *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved