# 數據庫緩存類
數據庫緩存類允許你把數據庫查詢結果保存在文本文件中以減少數據庫訪問。
>[danger] 重要
> 當緩存啟用時,本類會被數據庫驅動自動加載,切勿手動加載。
> 并非所有查詢結果都能被緩存,請仔細閱讀本頁內容。
## 啟用緩存
啟用緩存需要三步:
* 在服務器上創建一個可寫的目錄以便保存緩存文件;
* 通過文件 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();
~~~
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量