資料庫緩衝類
資料庫緩衝類允許你把資料庫查詢結果儲存在文字檔中以減少資料庫訪問。
重要
當緩衝啟用時,本類會被資料庫驅動自動載入,切勿手動載入。
重要
並非所有查詢結果都能被緩衝,請仔細閱讀本頁內容。 啟用緩衝
啟用緩衝需要三步: 在伺服器上建立一個可寫的目錄以便儲存快取檔案; 通過檔案 application/config/database.php 中的 cachedir 參數設定其目錄路徑; 通過將檔案 application/config/database.php 中的 cache_on 參數設定為 TRUE,也可以用下面的方法手動設定。
緩衝一旦啟用,每一次載入頁面時,只要該頁面含有資料庫查詢就會自動緩衝起來。 緩衝是如何工作的。
當你在訪問頁面時,CodeIgniter 的查詢快取系統會自動運行。如果緩衝被啟用,當頁面第一次載入時,查詢結果對象會被序列化並儲存到伺服器上的一個文字檔中。當下次再訪問該頁面時,會直接使用快取檔案而不用訪問資料庫了,這樣,在已緩衝的頁面,你的資料庫訪問會降為 0 。
只有讀類型(SELECT)的查詢可以被緩衝,因為只有這類查詢才會產生結果。寫類型的查詢(INSERT、UPDATE 等)並不會產生結果,所以不會被緩衝。
快取檔案永不到期,所有的查詢只要緩衝下來以後除非你刪除它們否則將一直可用。你可以針對特定的頁面來刪除緩衝,或者也可以清空掉所有的緩衝。一般來說,你可以在某些事件發生時(如資料庫中添加了資料)用下面的函數來清除緩衝。 緩衝能夠提升網站的效能嗎。
緩衝能否獲得效能增益,取決於很多因素。如果你有一個低負荷而高度最佳化的資料庫,你可能不會看到效能的提升。而如果你的資料庫正在被大量訪問,您可能會看到緩衝後的性有所提升,前提是你的檔案系統並沒有太多的開銷。要記住一點的是,緩衝只是簡單的改變了資料擷取的途徑而已,從訪問資料庫變成了訪問檔案系統。
例如,在一些叢集伺服器環境中,由於檔案系統的操作太過頻繁,緩衝其實是有害的。在共用的單一伺服器環境中,緩衝才可能有益。不幸的是,關於是否需要緩衝你的資料庫這個問題並沒有唯一的答案,這完全取決於你的情況。 快取檔案是如何儲存的。
CodeIgniter 將每個查詢都緩衝到它單獨的快取檔案中,根據調用的控制器方法快取檔案被進一步組織到各自的子目錄中。更準確的說,子目錄是使用你 URI的前兩段(控制器名 和 方法名)命名的。
例如,你有一個 blog 控制器和一個 comments 方法,並含有三個不同的查詢。緩衝系統將建立一個名為 blog+comments 的目錄,並在該目錄下產生三個快取檔案。
如果你的 URI 中含有動態查詢時(例如使用分頁時),每個查詢執行個體都會產生它單獨的快取檔案,因此,最終可能會出現快取檔案數是你頁面中的查詢次數的好幾倍這樣的情況。 管理你的快取檔案
由於快取檔案不會到期,那麼你的應用程式中應該有刪除緩衝的機制,例如,我們假設你有一個部落格並允許使用者評論,每當提交一個新評論時,你都應該刪除掉關於顯示評論的那個控制器方法對應的快取檔案。下面將介紹有兩種不同的方法用來刪除快取資料。 不是所有的資料庫方法都相容緩衝
最後,我們必須得指出被緩衝的結果對象只是一個簡化版的結果對象,正因為這樣,有幾個查詢結果的方法無法使用。
下面列出的方法是無法在緩衝的結果對象上使用的: num_fields() field_names() field_data() free_result()
同時,result_id 和 conn_id 這兩個 id 也無法使用,因為這兩個 id只適用於即時的資料庫操作。 函數參考 $this->db->cache_on() / $this->db->cache_off()
用於手工啟用/禁用緩衝,當你不想緩衝某些查詢時,這兩個方法會很有用。例子:
// Turn caching on$this->db->cache_on();$query = $this->db->query("SELECT * FROM mytable");// Turn caching off for this one query$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");
$this->db->cache_delete()
刪除特定頁面的快取檔案,這當你更新你的資料庫之後需要清除緩衝時很有用。
緩衝系統根據你訪問頁面的 URI 來將緩衝寫入到相應的快取檔案中去,例如,如果你在訪問 example.com/index.php/blog/comments 這個頁面,緩衝系統會將快取檔案儲存到 blog+comments 目錄下,要刪除這些快取檔案,你可以使用:
$this->db->cache_delete('blog', 'comments');
如果你沒提供任何參數,將會清除當前 URI 對應的快取檔案。 $this->db->cache_delete_all()
清除所有的快取檔案,例如:
$this->db->cache_delete_all();