首頁 > php框架 > ThinkPHP > 主體

thinkphp有哪些快取類型

爱喝马黛茶的安东尼
發布: 2019-08-22 13:43:47
原創
2441 人瀏覽過

thinkphp有哪些快取類型

ThinkPHP提供了方便的快取方式,包括資料快取、靜態快取和查詢快取等,支援包括檔案方式、APC、Db、Memcache、Shmop、 Sqlite、Redis、Eaccelerator和Xcache在內的動態資料快取類型,以及可自訂的靜態快取規則,並提供了快捷方法進行存取操作。

資料快取

Thinkphp快取檔案的配置

Home是我建立的前台項目,在Home\Conf\config.php找到快取的配置文件,配置如下:

<?php   
   return array(       
   &#39;DB_TYPE&#39;=>&#39;mysql&#39;,       
   &#39;DB_HOST&#39;=>&#39;127.0.0.1&#39;,       
  &#39;DB_NAME&#39;=>&#39;w3note&#39;,       
   &#39;DB_USER&#39;=>&#39;root&#39;,       
  &#39;DB_PWD&#39;=>&#39;123456&#39;,       
  &#39;DB_PORT&#39;=>&#39;3306&#39;,       
  &#39;DB_PREFIX&#39;=>&#39;w3_&#39;,       
  &#39;DATA_CACHE_TYPE&#39;=>&#39;file&#39;,//设置缓存方式为file       
  &#39;DATA_CACHE_TIME&#39;=>&#39;600&#39;,//缓存周期600秒       
 );       
 ?>
登入後複製

Thinkphp快取函數的使用

在thinkphp中,使用快捷快取函數S()進行緩存,其用法如下:

S(&#39;data&#39;,$Data);//使用data标识缓存$Data数据  
S(&#39;data&#39;,$Data,600);// 缓存$Data数据600秒  
 $Data = S(&#39;data&#39;);// 获取缓存数据  
S(&#39;data&#39;,NULL);// 删除缓存数据
登入後複製

實例示範

<?php       
 // 本类由系统自动生成,仅供测试用途       
  class IndexAction extends Action{       
    public function index(){       
        //如果有缓存,则读取缓存数据       
        //如果没有缓存,则读取数据库当中的数据放入缓存       
        $lists=S(&#39;lists&#39;);                     
        if(emptyempty($lists)){                           
          $news=M(&#39;news&#39;);   
          $lists=$news->select();   
          S(&#39;lists&#39;,$lists,600);   
          echo &#39;这是直接读取数据库的数据&#39;;       
           }   
        dump($list);  
 ?>
登入後複製

造訪http://127.0.0.1/Home/index.php/Index/index,

第一次造訪:

這是直接讀取資料庫的數據

array(10) {  
   [0] => array(12) {  
     ["id"] => string(1) "1"  
     ["catid"] => string(2) "13"  
     ["title"] => string(4) "thinkphp的缓存技术"  
     ["content"] => string(8) "thinkphp的缓存技术"  
     ["tags"] => string(4) "缓存"  
     ["thumb"] => string(0) ""  
     ["description"] => string(7) "thinkphp的缓存技术"  
     ["inputtime"] => string(10) "1348370202"  
     ["posid"] => string(1) "1"  
     ["ord"] => string(1) "2"  
     ["hits"] => string(1) "1"  
     ["status"] => string(1) "1"  
 }
登入後複製
登入後複製

第二次訪問:

array(10) {  
   [0] => array(12) {  
     ["id"] => string(1) "1"  
     ["catid"] => string(2) "13"  
     ["title"] => string(4) "thinkphp的缓存技术"  
     ["content"] => string(8) "thinkphp的缓存技术"  
     ["tags"] => string(4) "缓存"  
     ["thumb"] => string(0) ""  
     ["description"] => string(7) "thinkphp的缓存技术"  
     ["inputtime"] => string(10) "1348370202"  
     ["posid"] => string(1) "1"  
     ["ord"] => string(1) "2"  
     ["hits"] => string(1) "1"  
     ["status"] => string(1) "1"  
 }
登入後複製
登入後複製

說明:第一次運行時,會打印出如上面所示信息,刷新一下頁面後,少了“ 這是直接讀取資料庫的資料" ,表示讀取的是先前產生的快取資料。

相關推薦:《ThinkPHP教學

快速快取

如果你只是希望用檔案的方式快取一些簡單的數據,並且沒有有效期的概念,那麼系統還提供了一個快速緩存方法F可以用來更快的操作。

快速快取Data數據,預設保存在DATA_PATH目錄下面

F(&#39;data&#39;,$Data);
登入後複製

快速快取Data數據,儲存到指定的目錄

F(&#39;data&#39;,$Data,TEMP_PATH);
登入後複製

取得快取資料

$Data = F(&#39;data&#39;);
登入後複製

刪除快取資料

F(&#39;data&#39;,NULL);
登入後複製

F方法支援自動建立快取子目錄,在DATA_PATH目錄下方快取data數據,如果User子目錄不存在,則自動建立:

F(&#39;User/data&#39;,$Data);
登入後複製

3.1.2版本開始F方法支援使用通配符批量刪除功能,使用如下:

F(&#39;User/*&#39;,NULL);
登入後複製

表示刪除DATA_PATH.'User/'目錄下面的資料快取。

系統內建的資料欄位資訊快取就是用了快速快取機制。

查詢快取

對於及時性要求不高的資料查詢,我們可以使用查詢快取功能來提高效能,而且無需自己使用快取方法進行快取和獲取。

APP/config.php設定:

&#39;DATA_CACHE_TIME&#39;   => 60, // 数据缓存有效期 0表示永久缓存
&#39;DATA_CACHE_TYPE&#39;   => &#39;File&#39;,
 // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator
&#39;DB_SQL_BUILD_CACHE&#39; => true,
&#39;DB_SQL_BUILD_LENGTH&#39; => 20, // SQL缓存的队列长度
&#39;DATA_CACHE_PATH&#39; => TEMP_PATH,
登入後複製

查詢快取功能支援所有的資料庫,並且支援所有的快取方式和有效期限。

在使用查詢快取的時候,只需要呼叫Model類別的cache方法,例如:

$Model->cache(true)->select();
登入後複製

如果使用了cache(true) ,則在查詢的同時會根據目前的查詢SQL產生查詢緩存,預設值快取方式採用DATA_CACHE_TYPE參數設定的快取方式(系統預設值為File表示採用檔案方式快取),快取有效期限是DATA_CACHE_TIME 參數設定的時間,也可以單獨制定查詢快取的快取方式和有效期限:

$Model->cache(true,60,&#39;xcache&#39;)->select();
登入後複製

表示目前查詢快取的快取方式為xcache,且快取有效期限為60秒。

同樣的查詢,如果沒有使用cache方法,則不會取得或產生任何緩存,即使是先前曾呼叫過Cache方法。

查詢快取只是供內部調用,如果希望查詢快取開放給其他程式調用,可以指定查詢快取的Key,例如:

$Model->cache(&#39;cache_name&#39;,60)->select();
登入後複製

則可以在外部透過S方法直接取得查詢緩存的內容,

$value = S(&#39;cache_name&#39;);
登入後複製

除了select方法之外,查詢快取還支援find和getField方法,以及他們的衍生方法(包括統計查詢和動態查詢方法)。具體應用的時候可以根據需要選擇快取方式和快取有效期限。

SQL解析快取

除了查詢快取之外,ThinkPHP也支援SQL解析緩存,因為ThinkPHP的ORM機制,所有的SQL都是動態產生的,然後由資料庫驅動執行。

所以如果你的應用程式有大量的SQL查詢需求,那麼可以開啟SQL解析快取以減少SQL解析來提高效能。要開啟SQL解析緩存,只需要設定:

&#39;DB_SQL_BUILD_CACHE&#39; => true,
登入後複製

即可開啟資料庫查詢的SQL建立緩存,預設快取方式為檔案方式,還可以支援xcache和apc方式緩存,只需要設定:

&#39;DB_SQL_BUILD_QUEUE&#39; => &#39;xcache&#39;,
登入後複製

我們知道,一個專案的查詢SQL的量可能會非常巨大,所以有必要設定下快取的佇列長度,例如,我們希望SQL解析快取不超過20筆記錄,可以設定:

&#39;DB_SQL_BUILD_LENGTH&#39; => 20, // SQL缓存的队列长度
登入後複製

注意:只有查詢方法才支援SQL解析快取

靜態快取

#要使用靜態快取功能,需要開啟HTML_CACHE_ON參數,並且使用HTML_CACHE_RULES配置參數設定靜態快取規則檔案。

雖然也可以在應用程式設定檔中定義靜態快取規則,但是建議是在模組設定檔中為不同的模組定義靜態快取規則。

靜態規則定義

靜態規則的定義方式如下:

&#39;HTML_CACHE_ON&#39; => true, // 开启静态缓存
&#39;HTML_CACHE_TIME&#39; => 60, // 全局静态缓存有效期(秒)
&#39;HTML_FILE_SUFFIX&#39; => &#39;.shtml&#39;, // 设置静态缓存文件后缀
&#39;HTML_CACHE_RULES&#39; => array( // 定义静态缓存规则
 // 定义格式1 数组方式
 &#39;静态地址&#39; => array(&#39;静态规则&#39;, &#39;有效期&#39;, &#39;附加规则&#39;), 
 // 定义格式2 字符串方式
 &#39;静态地址&#39; => &#39;静态规则&#39;, 
)
登入後複製

定義格式1採用陣列方式便於單獨為某個靜態規則設定不同的有效期限,定義格式2採用字串方式訂閱靜態規則,同時採用HTML_CACHE_TIME設定的全域靜態快取有效期限。

静态缓存文件的根目录在HTML_PATH定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存。 并且静态缓存支持不同的存储类型。 静态缓存仅在GET请求下面有效。

静态地址

静态地址包括下面几种定义格式:

第一种是定义全局的操作静态规则,例如定义所有的read操作的静态规则为:

&#39;read&#39;=>array(&#39;{id}&#39;,60)
登入後複製

其中,{id}

表示取$_GET['id']

为静态缓存文件名,第二个参数表示缓存60秒。

第二种是定义全局的控制器静态规则,例如定义所有的User控制器的静态规则为:

&#39;user:&#39;=>array(&#39;User/{:action}_{id}&#39;,&#39;600&#39;)
登入後複製

其中,{:action}

表示当前的操作名称

第三种是定义某个控制器的操作的静态规则,例如,我们需要定义Blog控制器的read操作进行静态缓存

&#39;blog:read&#39;=>array(&#39;{id}&#39;,0)
登入後複製

第四种方式是定义全局的静态缓存规则,这个属于特殊情况下的使用,任何模块的操作都适用,例如:

&#39;*&#39;=>array(&#39;{$_SERVER.REQUEST_URI|md5}&#39;),
登入後複製

表示根据当前的URL进行缓存。

静态规则

静态规则是用于定义要生成的静态文件的名称,静态规则的定义要确保不会冲突,写法可以包括以下情况:

1.使用系统变量

包括 _GET、_REQUEST、_SERVER、_SESSION、_COOKIE

格式:

{$_×××|function}
登入後複製

例如:

{$_GET.name} 
{$_SERVER.REQUEST_URI|md5}
登入後複製

2.使用框架特定的变量

{:module} 、{:controller} 和{:action}
登入後複製

分别表示当前模块名、控制器名和操作名。

例如:

{:module}/{:controller}_{:action}
登入後複製

3.使用_GET变量

{var|function}也就是说 {id}其实等效于 {$_GET.id}

4.直接使用函数

{|function} 例如:{|time}

5.支持混合定义

例如我们可以定义一个静态规则为:

&#39;{id},{name|md5}&#39;
登入後複製

在{}之外的字符作为字符串对待,如果包含有"/",会自动创建目录。

例如,定义下面的静态规则:

{:module}/{:action}_{id}
登入後複製

则会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。

静态缓存有效期

单位为秒。如果不定义,则会获取配置参数HTML_CACHE_TIME的设置值,如果定义为0则表示永久缓存。

附加规则

通常用于对静态规则进行函数运算,例如:

&#39;read&#39;=>array(&#39;Think{id},{name}&#39;,&#39;60&#39;, &#39;md5&#39;)
登入後複製

翻译后的静态规则是

md5(&#39;Think&#39;.$_GET[&#39;id&#39;]. &#39;, &#39;.$_GET[&#39;name&#39;]);
登入後複製

以上是thinkphp有哪些快取類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板