?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
數(shù)據(jù)庫緩存類允許您將查詢緩存為文本文件,以減少數(shù)據(jù)庫負(fù)載。
重要
當(dāng)啟用緩存時(shí),該類由數(shù)據(jù)庫驅(qū)動(dòng)程序自動(dòng)初始化。不要手動(dòng)加載這個(gè)類。
重要
使用緩存時(shí),并非所有查詢結(jié)果函數(shù)都可用。請(qǐng)仔細(xì)閱讀這一頁。
緩存分三個(gè)步驟啟用:
在您的服務(wù)器上創(chuàng)建一個(gè)可寫目錄,在那里可以存儲(chǔ)緩存文件。
在應(yīng)用程序/config/database.php文件中設(shè)置緩存文件夾的路徑。
通過在application/config/database.php文件中設(shè)置首選項(xiàng),或者手動(dòng)地啟用緩存特性,如下所述。
一旦啟用,每當(dāng)加載包含數(shù)據(jù)庫查詢的頁面時(shí),緩存將自動(dòng)發(fā)生。
CodeIgniter的查詢緩存系統(tǒng)在查看頁面時(shí)動(dòng)態(tài)發(fā)生。啟用緩存時(shí),首次加載網(wǎng)頁時(shí),查詢結(jié)果對(duì)象將被序列化并存儲(chǔ)在服務(wù)器上的文本文件中。下一次加載頁面時(shí),將使用緩存文件而不是訪問數(shù)據(jù)庫。對(duì)于已緩存的任何頁面,您的數(shù)據(jù)庫使用率可以有效地降至零。
只有讀取類型(SELECT)查詢可以被緩存,因?yàn)檫@些是產(chǎn)生結(jié)果的唯一類型的查詢。寫入類型(INSERT,UPDATE等)查詢,因?yàn)樗鼈儾簧山Y(jié)果,不會(huì)被系統(tǒng)緩存。
緩存文件不會(huì)過期。任何已被緩存的查詢將保留緩存,直到您將其刪除。緩存系統(tǒng)允許您清除與單個(gè)頁面關(guān)聯(lián)的緩存,或者可以刪除整個(gè)緩存文件集合。通常情況下,您需要使用下面介紹的內(nèi)務(wù)管理功能在發(fā)生特定事件后刪除緩存文件,例如在將新信息添加到數(shù)據(jù)庫時(shí)。
由于緩存而獲得性能增益取決于許多因素。如果您的負(fù)載非常輕微,并且具有高度優(yōu)化的數(shù)據(jù)庫,那么您可能看不到性能提升。如果你的數(shù)據(jù)庫被大量使用,你可能會(huì)看到一個(gè)改進(jìn)的響應(yīng),假設(shè)你的文件系統(tǒng)沒有過度征稅。請(qǐng)記住,緩存只會(huì)改變您的信息檢索方式,將其從數(shù)據(jù)庫操作轉(zhuǎn)移到文件系統(tǒng)。
例如,在一些集群服務(wù)器環(huán)境中,由于文件系統(tǒng)操作非常激烈,緩存可能是有害的。在共享環(huán)境中的單個(gè)服務(wù)器上,緩存可能會(huì)有所幫助。不幸的是,你是否應(yīng)該緩存數(shù)據(jù)庫的問題沒有單一的答案。這真的取決于你的情況。
CodeIgniter將每個(gè)查詢的結(jié)果放入它自己的緩存文件中。緩存文件集進(jìn)一步組織到與您的控制器功能相對(duì)應(yīng)的子文件夾中。確切地說,子文件夾的名稱與您的URI的前兩個(gè)段(控制器類名稱和函數(shù)名稱)的名稱完全相同。
例如,假設(shè)您有一個(gè)名為blog的控制器,其中包含一個(gè)名為comments的函數(shù),其中包含三個(gè)查詢。緩存系統(tǒng)將創(chuàng)建一個(gè)名為blog + comments的緩存文件夾,其中將寫入三個(gè)緩存文件。
如果您使用基于URI中信息更改的動(dòng)態(tài)查詢(例如,在使用分頁時(shí)),則查詢的每個(gè)實(shí)例都將生成自己的緩存文件。因此,有可能最終獲得的緩存文件比查詢多得多。
由于緩存文件不會(huì)過期,因此您需要在應(yīng)用程序中創(chuàng)建刪除例程。例如,假設(shè)您有一個(gè)允許用戶評(píng)論的博客。無論何時(shí)提交新評(píng)論,您都需要?jiǎng)h除與提供評(píng)論的控制器功能相關(guān)聯(lián)的緩存文件。您會(huì)發(fā)現(xiàn)下面介紹的兩個(gè)刪除功能,可幫助您清除數(shù)據(jù)。
最后,我們需要指出,被緩存的結(jié)果對(duì)象是完整結(jié)果對(duì)象的簡化版本。出于這個(gè)原因,一些查詢結(jié)果函數(shù)不可用。
當(dāng)使用緩存的結(jié)果對(duì)象時(shí),下列函數(shù)不可用:
NUM_FIELDS()
FIELD_NAMES()
field_data()
free_result()
此外,兩個(gè)數(shù)據(jù)庫資源(result_id和conn_id)在緩存時(shí)不可用,因?yàn)榻Y(jié)果資源僅與運(yùn)行時(shí)操作有關(guān)。
手動(dòng)啟用/禁用緩存。如果你想保持某些查詢不被緩存,這會(huì)很有用。例:
// 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");
刪除與特定頁關(guān)聯(lián)的緩存文件。如果您需要在更新數(shù)據(jù)庫后清除緩存,這是非常有用的。
緩存系統(tǒng)將緩存文件保存到與您正在查看的頁面的URI相對(duì)應(yīng)的文件夾。例如,如果您正在example.com/index.php/blog/comments上查看頁面,則緩存系統(tǒng)會(huì)將與其關(guān)聯(lián)的所有緩存文件放在名為blog + comments的文件夾中。要?jiǎng)h除您將使用的特定緩存文件:
$this->db->cache_delete('blog', 'comments');
如果不使用任何參數(shù),則在確定應(yīng)清除哪些內(nèi)容時(shí)將使用當(dāng)前URI。
清除所有現(xiàn)有的緩存文件。例子:
$this->db->cache_delete_all();