做這個(gè)項(xiàng)目時(shí)躬窜,服務(wù)端最開(kāi)始是使用原生php寫的浇垦,在查詢數(shù)據(jù)庫(kù)時(shí),沒(méi)有做任何緩存荣挨,后來(lái)做到商城男韧,采用thinkphp框架,頁(yè)面加載突然提速了很多默垄,專門和做php的朋友交流了一下此虑,了解到thinkphp內(nèi)置緩存機(jī)制,無(wú)需從磁盤實(shí)時(shí)查詢mysql口锭,大多數(shù)時(shí)候從緩存(內(nèi)存)中讀取數(shù)據(jù)朦前。記錄如下:
原理
如果沒(méi)有緩存的網(wǎng)站是百萬(wàn)級(jí)或者千萬(wàn)級(jí)的訪問(wèn)量,會(huì)給數(shù)據(jù)庫(kù)或者服務(wù)器造成很大的壓力,通過(guò)緩存,大幅減少服務(wù)器和數(shù)據(jù)庫(kù)的負(fù)荷,假如我們把讀取數(shù)據(jù)的過(guò)程分為三個(gè)層,第一個(gè)是訪問(wèn)層,第一個(gè)是緩存層,第三個(gè)是數(shù)據(jù)庫(kù)存取層,如果沒(méi)有緩存層,訪問(wèn)層是直接從數(shù)據(jù)庫(kù)存取層讀取數(shù)據(jù),而設(shè)置緩存后,訪問(wèn)層不再是直接在數(shù)據(jù)庫(kù)存取層讀取,而是從緩存層讀取數(shù)據(jù).
我們做個(gè)簡(jiǎn)單的對(duì)比,假設(shè)一個(gè)頁(yè)面,在一個(gè)小時(shí)可被訪問(wèn)100萬(wàn)次,如果這個(gè)頁(yè)面每次被訪問(wèn)的時(shí)候,都直接讀取數(shù)據(jù)庫(kù)后再編譯生成,在一個(gè)小時(shí)內(nèi)將會(huì)重復(fù)性的生成100萬(wàn)次,而如果這個(gè)頁(yè)面被周期性的緩存10分鐘,也就是每間隔10分鐘緩存數(shù)據(jù)才會(huì)被生成一次,一個(gè)小時(shí)內(nèi)只會(huì)被生成6次,兩種方式一對(duì)比,效果明顯,兩種比較下服務(wù)器負(fù)荷的壓力比差別十幾萬(wàn)倍以上,緩存技術(shù)將使得網(wǎng)站負(fù)載在高峰期游刃有余.
緩存使用
ThinkPHP提供了方便的緩存方式介杆,包括數(shù)據(jù)緩存、靜態(tài)緩存和查詢緩存等韭寸,支持包括文件方式春哨、APC、Db恩伺、Memcache赴背、Shmop、Sqlite晶渠、Redis癞尚、Eaccelerator和Xcache在內(nèi)的動(dòng)態(tài)數(shù)據(jù)緩存類型,以及可定制的靜態(tài)緩存規(guī)則乱陡,并提供了快捷方法進(jìn)行存取操作浇揩。
數(shù)據(jù)緩存
- Thinkphp緩存文件的配置
Home是我建立的前臺(tái)項(xiàng)目,在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',//設(shè)置緩存方式為file
'DATA_CACHE_TIME'=>'600',//緩存周期600秒
);
?>
- Thinkphp緩存函數(shù)的使用
在thinkphp中,使用快捷緩存函數(shù)S()進(jìn)行緩存,其用法如下:
S('data',$Data);//使用data標(biāo)識(shí)緩存$Data數(shù)據(jù)
S('data',$Data,600);// 緩存$Data數(shù)據(jù)600秒
$Data = S('data');// 獲取緩存數(shù)據(jù)
S('data',NULL);// 刪除緩存數(shù)據(jù)
- 實(shí)例演示
<?php
// 本類由系統(tǒng)自動(dòng)生成,僅供測(cè)試用途
class IndexAction extends Action{
public function index(){
//如果有緩存憨颠,則讀取緩存數(shù)據(jù)
//如果沒(méi)有緩存胳徽,則讀取數(shù)據(jù)庫(kù)當(dāng)中的數(shù)據(jù)放入緩存
$lists=S('lists');
if(emptyempty($lists)){
$news=M('news');
$lists=$news->select();
S('lists',$lists,600);
echo '這是直接讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)';
}
dump($list);
?>
訪問(wèn)http://127.0.0.1/Home/index.php/Index/index,
第一次訪問(wèn):
這是直接讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)
array(10) {
[0] => array(12) {
["id"] => string(1) "1"
["catid"] => string(2) "13"
["title"] => string(4) "thinkphp的緩存技術(shù)"
["content"] => string(8) "thinkphp的緩存技術(shù)"
["tags"] => string(4) "緩存"
["thumb"] => string(0) ""
["description"] => string(7) "thinkphp的緩存技術(shù)"
["inputtime"] => string(10) "1348370202"
["posid"] => string(1) "1"
["ord"] => string(1) "2"
["hits"] => string(1) "1"
["status"] => string(1) "1"
}
第二次訪問(wèn):
array(10) {
[0] => array(12) {
["id"] => string(1) "1"
["catid"] => string(2) "13"
["title"] => string(4) "thinkphp的緩存技術(shù)"
["content"] => string(8) "thinkphp的緩存技術(shù)"
["tags"] => string(4) "緩存"
["thumb"] => string(0) ""
["description"] => string(7) "thinkphp的緩存技術(shù)"
["inputtime"] => string(10) "1348370202"
["posid"] => string(1) "1"
["ord"] => string(1) "2"
["hits"] => string(1) "1"
["status"] => string(1) "1"
}
說(shuō)明:第一次運(yùn)行時(shí),會(huì)打印出如上面所示信息,刷新一下頁(yè)面后,少了 “ 這是直接讀取數(shù)據(jù)庫(kù)的數(shù)據(jù)" ,說(shuō)明讀取的是先前生成的緩存數(shù)據(jù).
快速緩存
如果你僅僅是希望用文件的方式緩存一些簡(jiǎn)單的數(shù)據(jù)爽彤,并且沒(méi)有有效期的概念养盗,那么系統(tǒng)還提供了一個(gè)快速緩存方法F可以用來(lái)更快的操作。
快速緩存Data數(shù)據(jù)适篙,默認(rèn)保存在DATA_PATH目錄下面
F('data',$Data);
快速緩存Data數(shù)據(jù)往核,保存到指定的目錄
F('data',$Data,TEMP_PATH);
獲取緩存數(shù)據(jù)
$Data = F('data');
刪除緩存數(shù)據(jù)
F('data',NULL);
F方法支持自動(dòng)創(chuàng)建緩存子目錄,在DATA_PATH目錄下面緩存data數(shù)據(jù)嚷节,如果User子目錄不存在聂儒,則自動(dòng)創(chuàng)建:
F('User/data',$Data);
3.1.2版本開(kāi)始F方法支持使用通配符批量刪除功能,使用如下:
F('User/*',NULL);
表示刪除DATA_PATH.'User/'目錄下面的數(shù)據(jù)緩存硫痰。
系統(tǒng)內(nèi)置的數(shù)據(jù)字段信息緩存就是用了快速緩存機(jī)制衩婚。
查詢緩存
對(duì)于及時(shí)性要求不高的數(shù)據(jù)查詢,我們可以使用查詢緩存功能來(lái)提高性能效斑,而且無(wú)需自己使用緩存方法進(jìn)行緩存和獲取非春。
APP/config.php配置:
'DATA_CACHE_TIME' => 60, // 數(shù)據(jù)緩存有效期 0表示永久緩存
'DATA_CACHE_TYPE' => 'File',
// 數(shù)據(jù)緩存類型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator
'DB_SQL_BUILD_CACHE' => true,
'DB_SQL_BUILD_LENGTH' => 20, // SQL緩存的隊(duì)列長(zhǎng)度
'DATA_CACHE_PATH' => TEMP_PATH,
查詢緩存功能支持所有的數(shù)據(jù)庫(kù),并且支持所有的緩存方式和有效期缓屠。
在使用查詢緩存的時(shí)候奇昙,只需要調(diào)用Model類的cache方法,例如:
$Model->cache(true)->select();
如果使用了cache(true) 敌完,則在查詢的同時(shí)會(huì)根據(jù)當(dāng)前的查詢SQL生成查詢緩存储耐,默認(rèn)情況下緩存方式采用DATA_CACHE_TYPE參數(shù)設(shè)置的緩存方式(系統(tǒng)默認(rèn)值為File表示采用文件方式緩存),緩存有效期是DATA_CACHE_TIME 參數(shù)設(shè)置的時(shí)間蠢挡,也可以單獨(dú)制定查詢緩存的緩存方式和有效期:
$Model->cache(true,60,'xcache')->select();
表示當(dāng)前查詢緩存的緩存方式為xcache弧岳,并且緩存有效期為60秒。
同樣的查詢业踏,如果沒(méi)有使用cache方法禽炬,則不會(huì)獲取或者生成任何緩存,即便是之前調(diào)用過(guò)Cache方法勤家。
查詢緩存只是供內(nèi)部調(diào)用腹尖,如果希望查詢緩存開(kāi)放給其他程序調(diào)用,可以指定查詢緩存的Key伐脖,例如:
$Model->cache('cache_name',60)->select();
則可以在外部通過(guò)S方法直接獲取查詢緩存的內(nèi)容热幔,
$value = S('cache_name');
除了select方法之外,查詢緩存還支持find和getField方法讼庇,以及他們的衍生方法(包括統(tǒng)計(jì)查詢和動(dòng)態(tài)查詢方法)绎巨。具體應(yīng)用的時(shí)候可以根據(jù)需要選擇緩存方式和緩存有效期。
SQL解析緩存
除了查詢緩存之外蠕啄,ThinkPHP還支持SQL解析緩存场勤,因?yàn)門hinkPHP的ORM機(jī)制,所有的SQL都是動(dòng)態(tài)生成的歼跟,然后由數(shù)據(jù)庫(kù)驅(qū)動(dòng)執(zhí)行和媳。
所以如果你的應(yīng)用有大量的SQL查詢需求,那么可以開(kāi)啟SQL解析緩存以減少SQL解析提高性能哈街。要開(kāi)啟SQL解析緩存留瞳,只需要設(shè)置:
'DB_SQL_BUILD_CACHE' => true,
即可開(kāi)啟數(shù)據(jù)庫(kù)查詢的SQL創(chuàng)建緩存,默認(rèn)緩存方式為文件方式骚秦,還可以支持xcache和apc方式緩存她倘,只需要設(shè)置:
'DB_SQL_BUILD_QUEUE' => 'xcache',
我們知道,一個(gè)項(xiàng)目的查詢SQL的量可能會(huì)非常巨大作箍,所以有必要設(shè)置下緩存的隊(duì)列長(zhǎng)度帝牡,例如,我們希望SQL解析緩存不超過(guò)20條記錄蒙揣,可以設(shè)置:
'DB_SQL_BUILD_LENGTH' => 20, // SQL緩存的隊(duì)列長(zhǎng)度
注意:只有查詢方法才支持SQL解析緩存
靜態(tài)緩存
要使用靜態(tài)緩存功能靶溜,需要開(kāi)啟HTML_CACHE_ON參數(shù),并且使用HTML_CACHE_RULES配置參數(shù)設(shè)置靜態(tài)緩存規(guī)則文件 懒震。
雖然也可以在應(yīng)用配置文件中定義靜態(tài)緩存規(guī)則罩息,但是建議是在模塊配置文件中為不同的模塊定義靜態(tài)緩存規(guī)則。
靜態(tài)規(guī)則定義
靜態(tài)規(guī)則的定義方式如下:
'HTML_CACHE_ON' => true, // 開(kāi)啟靜態(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ī)則',
)
定義格式1采用數(shù)組方式 便于單獨(dú)為某個(gè)靜態(tài)規(guī)則設(shè)置不同的有效期个扰,定義格式2采用字符串方式訂閱靜態(tài)規(guī)則瓷炮,同時(shí)采用HTML_CACHE_TIME設(shè)置的全局靜態(tài)緩存有效期。
靜態(tài)緩存文件的根目錄在HTML_PATH定義的路徑下面递宅,并且只有定義了靜態(tài)規(guī)則的操作才會(huì)進(jìn)行靜態(tài)緩存娘香。 并且靜態(tài)緩存支持不同的存儲(chǔ)類型苍狰。 靜態(tài)緩存僅在GET請(qǐng)求下面有效。
靜態(tài)地址
靜態(tài)地址包括下面幾種定義格式:
- 第一種是定義全局的操作靜態(tài)規(guī)則烘绽,例如定義所有的read操作的靜態(tài)規(guī)則為:
'read'=>array('{id}',60)
其中淋昭,{id}
表示取$_GET['id']
為靜態(tài)緩存文件名,第二個(gè)參數(shù)表示緩存60秒安接。
- 第二種是定義全局的控制器靜態(tài)規(guī)則翔忽,例如定義所有的User控制器的靜態(tài)規(guī)則為:
'user:'=>array('User/{:action}_{id}','600')
其中,{:action}
表示當(dāng)前的操作名稱
- 第三種是定義某個(gè)控制器的操作的靜態(tài)規(guī)則盏檐,例如歇式,我們需要定義Blog控制器的read操作進(jìn)行靜態(tài)緩存
'blog:read'=>array('{id}',0)
- 第四種方式是定義全局的靜態(tài)緩存規(guī)則,這個(gè)屬于特殊情況下的使用胡野,任何模塊的操作都適用材失,例如
'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
表示根據(jù)當(dāng)前的URL進(jìn)行緩存。
靜態(tài)規(guī)則
靜態(tài)規(guī)則是用于定義要生成的靜態(tài)文件的名稱硫豆,靜態(tài)規(guī)則的定義要確保不會(huì)沖突豺憔,寫法可以包括以下情況:
- 使用系統(tǒng)變量
包括 _GET、_REQUEST够庙、_SERVER恭应、_SESSION、_COOKIE
格式:
{$_×××|function}
例如:
{$_GET.name}
{$_SERVER.REQUEST_URI|md5}
- 使用框架特定的變量
{:module} 耘眨、{:controller} 和{:action}
分別表示當(dāng)前模塊名昼榛、控制器名和操作名。
例如:
{:module}/{:controller}_{:action}
使用_GET變量
{var|function}也就是說(shuō) {id}其實(shí)等效于 {$_GET.id}直接使用函數(shù)
{|function} 例如:{|time}支持混合定義
例如我們可以定義一個(gè)靜態(tài)規(guī)則為:
'{id},{name|md5}'
在{}之外的字符作為字符串對(duì)待剔难,如果包含有"/"胆屿,會(huì)自動(dòng)創(chuàng)建目錄。
例如偶宫,定義下面的靜態(tài)規(guī)則:
{:module}/{:action}_{id}
則會(huì)在靜態(tài)目錄下面創(chuàng)建模塊名稱的子目錄非迹,然后寫入操作名_id.shtml 文件。
靜態(tài)緩存有效期
單位為秒纯趋。如果不定義憎兽,則會(huì)獲取配置參數(shù)HTML_CACHE_TIME的設(shè)置值,如果定義為0則表示永久緩存吵冒。
附加規(guī)則
通常用于對(duì)靜態(tài)規(guī)則進(jìn)行函數(shù)運(yùn)算纯命,例如
'read'=>array('Think{id},{name}','60', 'md5')
翻譯后的靜態(tài)規(guī)則是
md5('Think'.$_GET['id']. ', '.$_GET['name']);
https://zhidao.baidu.com/question/549987060.html
THINKPHP 怎么開(kāi)啟模版緩存