制作緩存的目的是為了讓我們的頁面運行更加快速,減少讀取數據庫內容的次數,給用戶更好的體驗,為此我們可以使自己的程序做一下緩存,並且設置一個緩存過期的時間,來保證與數據庫的一致,當然並不是所有的程序都適合做緩存,這里簡單介紹一下php靜態緩存制作的方法:
1.首先我們要定好一個緩存文件存放的位置,即存放目錄(李昌輝)
例如我這里存放在cache目錄下,將來所有的緩存文件都放到該目錄下
2.在要做靜態緩存的頁面,我們定義一個變量來存放一個緩存文件的路徑(相對於當前頁面的路徑)
$filename = "./cache/test.html";
3.定義一個變量來存儲緩存過期時間
$cachetime = 5;
4.判斷一下,緩存文件是否存在或者是否過期,如果緩存文件不存在就執行源代碼生成緩存,或者時間過期了也應該重新緩存一下,如果上述條件不滿足則調用緩存頁面顯示。
if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) { //緩存頁面代碼 } else { include($filename);//如果存在,調用緩存文件 }
5.生成緩存,在頁面輸出內容之前,我們調用ob_start()方法打開內存緩沖區,將要輸出的內容放到內存里面。
ob_start();
6.在頁面輸出完之后,將內存中獲取到的內容保存下來,存為一個靜態頁面。
//從內存緩存中獲取頁面代碼 $content = ob_get_contents(); //將獲取到的內容存放到緩存文件 file_put_contents($filename,$content); //清掉內存緩存 ob_flush();
7.最后我們加上一段輸出,來測試是否重新緩存了,如果頁面有輸出該內容代表重新生成了緩存文件,如果沒有,說明是直接讀的緩存文件
echo "######################################"; //測試是否調用了緩存文件,緩存文件不輸出這句話
這樣我們就簡單做了一個靜態緩存,完整代碼如下:
<?php $filename = "./cache/test.html"; //定義緩存有效期 $cachetime = 5; //判斷緩存文件是否存在 if(!file_exists($filename) || filemtime($filename)+$cachetime<time()) //filemtime($filename)獲取文件修改時間,加上定義的緩存時間小於當前時間 { //開啟內存緩存 ob_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body> <h1>水果信息表</h1> <table width="100%" border="1" cellpadding="0" cellspacing="0" > <tr> <td>代號</td> <td>名稱</td> <td>價格</td> <td>產地</td> <td>庫存</td> <td>操作</td> </tr> <?php //造連接對象 $db = new MySQLi("localhost","root","123","mydb"); //寫SQL語句 $sql = "select * from fruit"; //執行 $result = $db->query($sql); //取數據 /*$attr = $result->fetch_all(); foreach($attr as $v) { echo "<tr><td>{$v[0]}</td><td>{$v[1]}</td><td>{$v[2]}</td><td>{$v[3]}</td><td>{$v[4]}</td></tr>"; }*/ while($attr = $result->fetch_row()) { echo "<tr><td>{$attr[0]}</td><td>{$attr[1]}</td><td>{$attr[2]}</td><td>{$attr[3]}</td><td>{$attr[4]}</td><td> <a href='shanchu.php?code={$attr[0]}' onclick=\"return confirm('確定刪除么')\"> 刪除 </a> <a href='xiugai.php?code={$attr[0]}'>修改</a> </td></tr>"; } ?> </table> <a href="add.php">添加數據</a> </body> </html> <?php //從內存緩存中獲取頁面代碼 $content = ob_get_contents(); //將獲取到的內容存放到緩存文件 file_put_contents($filename,$content); //清掉內存緩存 ob_flush(); echo "######################################"; //測試是否調用了緩存文件,緩存文件不輸出這句話 } else { include($filename); //如果存在,調用緩存文件 } ?>
最后來看一下,效果:
第一次執行該頁面,出現緩存:
再次執行,則沒有重新建立緩存,而是直接讀取的靜態頁面test.html:
過了一段時間,又重新生成了緩存,這個時間就是我們之前設置的緩存過期時間。