ThinkPHP實現(xiàn)靜態(tài)緩存和動態(tài)緩存

靜態(tài)緩存

要使用靜態(tài)緩存功能,需要開啟HTML_CACHE_ON參數(shù),并且使用HTML_CACHE_RULES配置參數(shù)設(shè)置靜態(tài)緩存規(guī)則文件。
定義靜態(tài)規(guī)則

'HTML_CACHE_ON'     =>    true, // 開啟靜態(tài)緩存
'HTML_CACHE_TIME'   =>    60,   // 全局靜態(tài)緩存有效期(秒)
'HTML_FILE_SUFFIX'  =>    '.shtml', // 設(shè)置靜態(tài)緩存文件后綴
'HTML_CACHE_RULES'  =>     array(  // 定義靜態(tài)緩存規(guī)則
     // 定義格式1 數(shù)組方式
     '靜態(tài)地址'    =>     array('靜態(tài)規(guī)則', '有效期', '附加規(guī)則'), 
     // 定義格式2 字符串方式
     '靜態(tài)地址'    =>     '靜態(tài)規(guī)則', 
)

靜態(tài)緩存文件的根目錄在HTML_PATH定義的路徑下面,并且只有定義了靜態(tài)規(guī)則的操作才會進行靜態(tài)緩存。 并且靜態(tài)緩存支持不同的存儲類型。 靜態(tài)緩存僅在GET請求下面有效。

靜態(tài)地址

  • 全局的操作靜態(tài)規(guī)則
    'read'=>array('{id}',60)//定義所有的read操作的靜態(tài)規(guī)則
  • 定義全局的控制器靜態(tài)規(guī)則
    'user:'=>array('User/{:action}_{id}','600')//定義所有的User控制器的靜態(tài)規(guī)則
  • 定義某個控制器的操作的靜態(tài)規(guī)則//定義Blog控制器的read操作進行靜態(tài)緩存
    'blog:read'=>array('{id}',0)//參數(shù)為0表示永久緩存
  • 定義全局的靜態(tài)緩存規(guī)則
    '*'=>array('{$_SERVER.REQUEST_URI|md5}')//這個屬于特殊情況下的使用,任何模塊的操作都適用

靜態(tài)規(guī)則

靜態(tài)規(guī)則是用于定義要生成的靜態(tài)文件的名稱,靜態(tài)規(guī)則的定義要確保不會沖突。

  • 使用系統(tǒng)變量
    {$_×××|function}//_GET、_REQUEST、_SERVER、_SESSION、_COOKIE
    {$_GET.name}
    {$_SERVER.REQUEST_URI|md5}
  • 使用框架自定義的變量
    {:module}/{:controller}_{:action}//{:module} 、{:controller} 和{:action}分別表示當(dāng)前模塊名、控制器名和操作名。
  • 使用_GET變量
    {var|function}//{id}其實等效于 {$_GET.id}
  • 直接使用函數(shù)
    {|function}//{|time},time函數(shù)獲取時間后作為文件名稱
  • 混合定義
    '{id},{name|md5}' //在{}之外的字符作為字符串對待,如果包含有"/",會自動創(chuàng)建目錄。
    {:module}/{:action}_{id}//會在靜態(tài)目錄下面創(chuàng)建模塊名稱的子目錄,然后寫入操作名_id.shtml 文件。

動態(tài)緩存

[S方法數(shù)據(jù)緩存]

  • 緩存初始化
    S(array('type'=>'xcache','expire'=>60));

系統(tǒng)目前已經(jīng)支持的緩存類型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache。如果S方法不傳入type參數(shù)初始化的話,則讀取配置文件中設(shè)置的DATA_CACHE_TYPE參數(shù)值作為默認(rèn)類型。同樣的道理,prefix參數(shù)如果沒有傳入會讀取配置文件的DATA_CACHE_PREFIX參數(shù)值,expire參數(shù)沒有傳入則讀取DATA_CACHE_TIME配置值作為默認(rèn)。

對于全局的緩存方式,一般我們建議添加prefix(緩存前綴)參數(shù)用以區(qū)分不同的應(yīng)用,以免混淆。

  • 設(shè)置緩存
    數(shù)據(jù)緩存可以支持緩存隊列,簡單的說就是可以限制緩存的數(shù)量,只需要在初始化的時候指定length參數(shù)。
    S('name',$value);
    S('name',$value,300);//緩存數(shù)據(jù)300秒
    S('name',$value,array('type'=>'file','expire'=>300));//改變之前的緩存方式或者更多的參數(shù)
    S(array('type'=>'xcache','length'=>100,'expire'=>60));//系統(tǒng)只會緩存最近的100條緩存數(shù)據(jù)。
  • 讀取緩存
    $value = S('name');//如果緩存標(biāo)識不存在或者已經(jīng)過期,則返回false,否則返回緩存值。
  • 刪除緩存
    S('name',null);

注意:使用每種緩存時,需要ThinkPHP加載對應(yīng)的驅(qū)動文件,并設(shè)置好對應(yīng)的配置。

  • 使用實例
    $user = M('User');
    $value = S('list');
    if (empty($value)) {
    $list = $user->select();
    S('list', $list, 3600);
    echo '這個是直接從數(shù)據(jù)庫中讀取的文件';
    dump($list);
    } else {
    echo '這個是緩存文件';
    dump($value);
    }

[快速緩存]

系統(tǒng)還提供了一個快速緩存方法F可以用來更快的操作,但是,F(xiàn)方法沒有有效期,F(xiàn)方法可以支持不同的存儲類型,如果是文件類型的話,默認(rèn)保存在DATA_PATH目錄下面。

  • 快速緩存Data數(shù)據(jù)
    F('data',$Data);
    F('data',$Data,TEMP_PATH);//快速緩存Data數(shù)據(jù),保存到指定的目錄
    F('User/data',$Data);//F方法支持自動創(chuàng)建緩存子目錄,在DATA_PATH目錄下面緩存data數(shù)據(jù),如果User子目錄不存在,則自動創(chuàng)建。
  • 獲取緩存數(shù)據(jù)
    $Data = F('data');
  • 刪除緩存數(shù)據(jù)
    F('data',NULL);

[查詢緩存]

查詢緩存功能支持所有的數(shù)據(jù)庫,并且支持所有的緩存方式和有效期。

  1. 在使用查詢緩存的時候,只需要調(diào)用Model類的cache方法。
    $Model->cache(true)->where('status=1')->select();
  2. 如果使用了cache(true),則在查詢的同時會根據(jù)當(dāng)前的查詢條件等信息生成一個帶有唯一標(biāo)識的查詢緩存,如果指定了key的話,則直接生成名稱為key的查詢緩存。
    $Model->cache('cache_name')->select();
  3. 默認(rèn)情況下緩存方式采用DATA_CACHE_TYPE參數(shù)設(shè)置的緩存方式(系統(tǒng)默認(rèn)值為File表示采用文件方式緩存),緩存有效期是DATA_CACHE_TIME參數(shù)設(shè)置的時間,也可以單獨制定查詢緩存的緩存方式和有效期。
    $Model->cache(true,60,'xcache')->select();
  4. 如果指定了查詢緩存的key的話,則可以在外部通過S方法直接獲取查詢緩存的內(nèi)容。
    $value = S('cache_name');
  5. 除了select方法之外,查詢緩存還支持find和getField方法,以及他們的衍生方法(包括統(tǒng)計查詢和動態(tài)查詢方法)。
    $Model->where($map)->cache('key',60)->find();

本文主要來自官方文檔,如有問題可參見ThinkPHP3.2官方文檔-緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 做這個項目時,服務(wù)端最開始是使用原生php寫的,在查詢數(shù)據(jù)庫時,沒有做任何緩存,后來做到商城,采用thinkphp...
    一只好奇的茂閱讀 6,279評論 1 48
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評論 18 399
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,422評論 6 13
  • 老豬,今天夜行,我去路看見月亮,掛在路燈上面,回程卻找不見它了。 你很久以前說命運捉弄人。是的,它老愛開玩笑,所以...
    人間石頭閱讀 332評論 0 2

友情鏈接更多精彩內(nèi)容