ThinkPHP提供了方便的快取方式,包括資料快取、靜態快取和查詢快取等,支援包括檔案方式、APC、Db、Memcache、Shmop、 Sqlite、Redis、Eaccelerator和Xcache在內的動態資料快取類型,以及可自訂的靜態快取規則,並提供了快捷方法進行存取操作。
資料快取
Thinkphp快取檔案的配置
Home是我建立的前台項目,在Home\Conf\config.php找到快取的配置文件,配置如下:
<?php return array( 'DB_TYPE'=>'mysql', 'DB_HOST'=>'127.0.0.1', 'DB_NAME'=>'w3note', 'DB_USER'=>'root', 'DB_PWD'=>'123456', 'DB_PORT'=>'3306', 'DB_PREFIX'=>'w3_', 'DATA_CACHE_TYPE'=>'file',//设置缓存方式为file 'DATA_CACHE_TIME'=>'600',//缓存周期600秒 ); ?>
Thinkphp快取函數的使用
在thinkphp中,使用快捷快取函數S()進行緩存,其用法如下:
S('data',$Data);//使用data标识缓存$Data数据 S('data',$Data,600);// 缓存$Data数据600秒 $Data = S('data');// 获取缓存数据 S('data',NULL);// 删除缓存数据
實例示範
<?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends Action{ public function index(){ //如果有缓存,则读取缓存数据 //如果没有缓存,则读取数据库当中的数据放入缓存 $lists=S('lists'); if(emptyempty($lists)){ $news=M('news'); $lists=$news->select(); S('lists',$lists,600); echo '这是直接读取数据库的数据'; } 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('data',$Data);
快速快取Data數據,儲存到指定的目錄
F('data',$Data,TEMP_PATH);
取得快取資料
$Data = F('data');
刪除快取資料
F('data',NULL);
F方法支援自動建立快取子目錄,在DATA_PATH目錄下方快取data數據,如果User子目錄不存在,則自動建立:
F('User/data',$Data);
3.1.2版本開始F方法支援使用通配符批量刪除功能,使用如下:
F('User/*',NULL);
表示刪除DATA_PATH.'User/'目錄下面的資料快取。
系統內建的資料欄位資訊快取就是用了快速快取機制。
查詢快取
對於及時性要求不高的資料查詢,我們可以使用查詢快取功能來提高效能,而且無需自己使用快取方法進行快取和獲取。
APP/config.php設定:
'DATA_CACHE_TIME' => 60, // 数据缓存有效期 0表示永久缓存 'DATA_CACHE_TYPE' => 'File', // 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator 'DB_SQL_BUILD_CACHE' => true, 'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存的队列长度 'DATA_CACHE_PATH' => TEMP_PATH,
查詢快取功能支援所有的資料庫,並且支援所有的快取方式和有效期限。
在使用查詢快取的時候,只需要呼叫Model類別的cache方法,例如:
$Model->cache(true)->select();
如果使用了cache(true) ,則在查詢的同時會根據目前的查詢SQL產生查詢緩存,預設值快取方式採用DATA_CACHE_TYPE參數設定的快取方式(系統預設值為File表示採用檔案方式快取),快取有效期限是DATA_CACHE_TIME 參數設定的時間,也可以單獨制定查詢快取的快取方式和有效期限:
$Model->cache(true,60,'xcache')->select();
表示目前查詢快取的快取方式為xcache,且快取有效期限為60秒。
同樣的查詢,如果沒有使用cache方法,則不會取得或產生任何緩存,即使是先前曾呼叫過Cache方法。
查詢快取只是供內部調用,如果希望查詢快取開放給其他程式調用,可以指定查詢快取的Key,例如:
$Model->cache('cache_name',60)->select();
則可以在外部透過S方法直接取得查詢緩存的內容,
$value = S('cache_name');
除了select方法之外,查詢快取還支援find和getField方法,以及他們的衍生方法(包括統計查詢和動態查詢方法)。具體應用的時候可以根據需要選擇快取方式和快取有效期限。
SQL解析快取
除了查詢快取之外,ThinkPHP也支援SQL解析緩存,因為ThinkPHP的ORM機制,所有的SQL都是動態產生的,然後由資料庫驅動執行。
所以如果你的應用程式有大量的SQL查詢需求,那麼可以開啟SQL解析快取以減少SQL解析來提高效能。要開啟SQL解析緩存,只需要設定:
'DB_SQL_BUILD_CACHE' => true,
即可開啟資料庫查詢的SQL建立緩存,預設快取方式為檔案方式,還可以支援xcache和apc方式緩存,只需要設定:
'DB_SQL_BUILD_QUEUE' => 'xcache',
我們知道,一個專案的查詢SQL的量可能會非常巨大,所以有必要設定下快取的佇列長度,例如,我們希望SQL解析快取不超過20筆記錄,可以設定:
'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存的队列长度
注意:只有查詢方法才支援SQL解析快取
靜態快取
#要使用靜態快取功能,需要開啟HTML_CACHE_ON參數,並且使用HTML_CACHE_RULES配置參數設定靜態快取規則檔案。
雖然也可以在應用程式設定檔中定義靜態快取規則,但是建議是在模組設定檔中為不同的模組定義靜態快取規則。
靜態規則定義
靜態規則的定義方式如下:
'HTML_CACHE_ON' => true, // 开启静态缓存 'HTML_CACHE_TIME' => 60, // 全局静态缓存有效期(秒) 'HTML_FILE_SUFFIX' => '.shtml', // 设置静态缓存文件后缀 'HTML_CACHE_RULES' => array( // 定义静态缓存规则 // 定义格式1 数组方式 '静态地址' => array('静态规则', '有效期', '附加规则'), // 定义格式2 字符串方式 '静态地址' => '静态规则', )
定義格式1採用陣列方式便於單獨為某個靜態規則設定不同的有效期限,定義格式2採用字串方式訂閱靜態規則,同時採用HTML_CACHE_TIME設定的全域靜態快取有效期限。
静态缓存文件的根目录在HTML_PATH定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存。 并且静态缓存支持不同的存储类型。 静态缓存仅在GET请求下面有效。
静态地址
静态地址包括下面几种定义格式:
第一种是定义全局的操作静态规则,例如定义所有的read操作的静态规则为:
'read'=>array('{id}',60)
其中,{id}
表示取$_GET['id']
为静态缓存文件名,第二个参数表示缓存60秒。
第二种是定义全局的控制器静态规则,例如定义所有的User控制器的静态规则为:
'user:'=>array('User/{:action}_{id}','600')
其中,{:action}
表示当前的操作名称
第三种是定义某个控制器的操作的静态规则,例如,我们需要定义Blog控制器的read操作进行静态缓存
'blog:read'=>array('{id}',0)
第四种方式是定义全局的静态缓存规则,这个属于特殊情况下的使用,任何模块的操作都适用,例如:
'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
表示根据当前的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.支持混合定义
例如我们可以定义一个静态规则为:
'{id},{name|md5}'
在{}之外的字符作为字符串对待,如果包含有"/",会自动创建目录。
例如,定义下面的静态规则:
{:module}/{:action}_{id}
则会在静态目录下面创建模块名称的子目录,然后写入操作名_id.shtml 文件。
静态缓存有效期
单位为秒。如果不定义,则会获取配置参数HTML_CACHE_TIME的设置值,如果定义为0则表示永久缓存。
附加规则
通常用于对静态规则进行函数运算,例如:
'read'=>array('Think{id},{name}','60', 'md5')
翻译后的静态规则是
md5('Think'.$_GET['id']. ', '.$_GET['name']);
以上是thinkphp有哪些快取類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!