數據庫緩存類允許你把數據庫查詢結果保存在文本文件中以減少數據庫訪問。
激活緩存需要三步:
一旦被激活,每一次含有數據庫查詢的頁面被加載時緩存就會自動發生。
當頁面被浏覽時CodeIgniter的查詢緩存系統能夠動態執行。如果緩存特性被激活,那麼在此頁面首次被加載時,數據庫查詢的結果對象將會被序列化並保存在你服務器的文本文件中。而頁面再次被加載時緩存文件將會替代數據庫查詢。如此,在被緩存的頁面中,你的數據庫使用率會降至0。
只有 讀類型(read-type) (SELECT) 查詢會被緩存,因為只有這種查詢會產生結果集。 寫類型(Write-type) (INSERT, UPDATE, 等等) 查詢,因為不會產生結果集,故緩存系統不對之進行緩存。
緩存文件不會過期,除非你刪掉,否則任何被緩存了的查詢會一直存在。緩存系統允許你按頁面清除,或把所有緩存都清除掉。一般來說,你可以在某些事件(比如向數據庫添加了數據)發生時用下面的函數來清除緩存。
緩存能否獲得性能增益,取決於很多因素。如果您有一個負荷很少而高度優化的數據庫,你可能不會看到性能提升。 如果您的數據庫正在大量使用,您可能會看到緩存後帶來的性能提升,前提是你的文件系統是並沒有太多開銷。在一些集群服務器環境,會出現這樣的情況,因為文件系統的操作太過頻繁,緩存無法正確生成。 在單一的服務器在共享的環境,高速緩存可能會是有益的。是否能有性能上的提升應還取決於您的數據庫。這要看您的具體情況。
CI把每次查詢的結果放置在自己的緩存文件裡。根據你的控制器函數,緩存文件集將被進一步組織到子目錄中。准確的話,子目錄的名稱由你的URI的前兩段(控件器類名和函數名)決定。例如,假設你有一個控制器blog和一個comments函數,這個函數包括三個查詢。緩存系統將創建一個叫做blog+comments的目錄並在這個目錄裡創建三個緩存文件。當你根據URI上的信息動態查詢時(例如使用分頁),每次查詢的實例將創建自己的緩存文件。因此,經過很多次查詢後,緩存文件的個數可能比你查詢的次數還多。
由於緩存文件不會過期,您需要在您的應用程序中寫入刪除緩存操作的代碼。例如,假設您有一個博客,讓用戶發表評論。每當有新的評論被提交您一定希望在某個控制器的方法中刪除緩存文件與控制器的功能。你會發現如下兩個刪除功能的介紹,可以幫助您清除數據。
可手動設置緩存開關。如果您想保留某些查詢不被緩存 這個功能就十分有用。例如:
// 打開緩存開關 $this->db->cache_on(); $query = $this->db->query("SELECT * FROM mytable"); // 使下面這條查詢不被緩存 $this->db->cache_off(); $query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'"); // Turn caching back on $this->db->cache_on(); $query = $this->db->query("SELECT * FROM another_table");
刪除緩存文件與特定網頁。如果你需要清除緩存後,更新您的數據庫。
緩存系統會在緩存存放目錄中建立與被訪問的URL所對應的子目錄,同時把緩存文件存放在那個子目錄中.緩存主目錄就是您在application/config/database.php 裡面設置的緩存目錄. 例如, 如果您正在浏覽地址為 example.com/index.php/blog/comments的頁面, 緩存系統會把所有生成的緩存文件放進一個以 blog+comments做為名稱的文件夾裡. 如果您要刪除關於剛才提到的這個例子與之對應的緩存文件 需要執行以下代碼:
$this->db->cache_delete('blog', 'comments');
$this->db->cache_delete('blog', 'comments'),我在實際測試的時候不起作用,不知道為什麼原因,不知道是不是小bug?但是下面的$this->db->cache_delete_all()是可以的,沒有問題。
如果您不使用任何參數,目前的URI設置將決定什麼時候應該清除/更新 該緩存。
清除所有所有的緩存文件。例子:
$this->db->cache_delete_all();
Codeigniter 支持緩存技術,以達到最快的速度。盡管CI已經相當高效了,但是網頁中的動態內容、主機的內存CPU 和數據庫讀取速度等因素直接影響了網頁的加載速度。 依靠網頁緩存,你的網頁可以達到近乎靜態網頁的加載速度,因為他們將程序輸出的結果保存到硬盤上了。
CI支持每個頁面單獨緩存,而且可以設置緩存更新時間。當一個網頁第一次被加載的時候,緩存文件將被保存到application/cache文件夾。 下次訪問的時候,系統就會直接讀取緩存文件,然後返回給用戶的浏覽器。如果緩存文件過期,它將被刪除並重新生成。
啟用緩存功能,只需要將下面的代碼放入你的任何一個控制器(controller)的方法(function)內:
$this->output->cache(n);
其中 n 是你希望緩存更新的 分鐘 數。可以使用 m/60 來精確到秒,例如 1/60 ,則是精確到 1秒。上面的代碼可以放到任何一個 function 裡面。他的出現順序對緩存並沒有影響,所以將它放在你認為最合乎邏輯的地方。一旦上面的代碼放到了控制器的方法中,頁面就會被緩存。
由於CI存儲緩存文件的方式,只有通過 view 文件的輸出才能被緩存。在緩存文件產生之前,請確保 application/cache 文件夾可寫。
如果你不再想使用緩存,僅需將上面的代碼從你的controller裡面刪除即可。注意: 這樣做並不能讓緩存文件立即消失,它將會自動過期並被刪除。如果你想立即刪除那些文件,就必須自己動手了。