WordPress高級(jí)開(kāi)發(fā),緩存機(jī)制
WordPress開(kāi)發(fā)中,一定離不開(kāi)和數(shù)據(jù)庫(kù)打交道,不管是插件也好,還是主題也好,一定會(huì)用上數(shù)據(jù)庫(kù)。插件還好說(shuō),但是主題,如果不優(yōu)化好,會(huì)極大增加數(shù)據(jù)庫(kù)查詢的次數(shù),數(shù)據(jù)庫(kù)查詢次數(shù)越多,對(duì)于網(wǎng)站來(lái)說(shuō),也就越慢了。
以主題開(kāi)發(fā)來(lái)說(shuō),先要了解WordPress文章循環(huán)。
在首頁(yè),WordPress會(huì)出現(xiàn)文章列表循環(huán),也就是說(shuō)通過(guò)數(shù)據(jù)庫(kù),查詢文章列表,放到一個(gè)變量里面。
至于查詢多少篇文章,以設(shè)置里面的為準(zhǔn)。
除了主查詢,其他的查詢,基本上和WordPress沒(méi)有關(guān)系了。
很多主題,除了主查詢,還有其他的查詢,以果核主站為例,使用的是justnews主題,除了上面的文章列表,還有下面的文章模塊,微信推文、圈內(nèi)新聞、以及果核視頻。
那么首頁(yè)訪問(wèn),光這三個(gè)模塊,就會(huì)多出3次文章查詢。經(jīng)過(guò)果核排查,果核網(wǎng)站目前首頁(yè)查詢次數(shù)超過(guò)了300次,這個(gè)數(shù)字無(wú)異于是非常恐怖的。
與數(shù)據(jù)庫(kù)打交道的地方
文章列表
評(píng)論區(qū)
文章閱讀次數(shù)、收藏、點(diǎn)贊等
如何查看次數(shù)呢,可以用到WPOPT插件的開(kāi)發(fā)與調(diào)試,開(kāi)啟以后,能在控制臺(tái)查看到性能信息。
如何減少查詢
對(duì)于查詢數(shù)據(jù)庫(kù),減少查詢,可以將文章轉(zhuǎn)換成純靜態(tài)頁(yè)面,常用的WordPress緩存插件包括WP Super Cache、W3 Total Cache和WP Fastest Cache等。這些插件可以自動(dòng)化地管理WordPress緩存,從而提高網(wǎng)站的性能和速度。
但是,更多的,是需要主題開(kāi)發(fā)者自己的素養(yǎng),不能為了實(shí)現(xiàn)一些炫酷的功能,查詢數(shù)據(jù)庫(kù)而不緩存。
果核之前在開(kāi)發(fā)CorePress Pro的時(shí)候,雖然沒(méi)有亂查詢,但是實(shí)現(xiàn)功能的時(shí)候,必須得和數(shù)據(jù)庫(kù)打交道,避免不了查詢。
但是隨著技術(shù)的提高,與對(duì)WordPress程序的剖析,學(xué)會(huì)了更多高級(jí)的技術(shù),用到了重構(gòu)的主題上,將之前CorePress Pro主題的接近100次數(shù)據(jù)庫(kù)查詢,減少到了30次左右的必要查詢,這些查詢更多的是WordPress自身的查詢。
如果有Redis,那么這個(gè)數(shù)字還能繼續(xù)減少。最終首頁(yè)查詢次數(shù),可以給查詢?yōu)?。當(dāng)然Redis的話,只能用一個(gè)網(wǎng)站,如果服務(wù)器上有多個(gè)Redis使用的話,可能造成數(shù)據(jù)混亂的情況。所以,我還是選擇了第一種方案,使用WordPress自帶緩存。
WordPress的transient
WordPress的transient是一種用于存儲(chǔ)短期數(shù)據(jù)的API。它可以將數(shù)據(jù)存儲(chǔ)在WordPress的數(shù)據(jù)庫(kù)中,并設(shè)置一個(gè)過(guò)期時(shí)間。在過(guò)期時(shí)間到達(dá)后,數(shù)據(jù)將被自動(dòng)刪除。
transient API提供了三個(gè)函數(shù)來(lái)管理緩存數(shù)據(jù):
set_transient($transient, $value, $expiration):將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,并設(shè)置過(guò)期時(shí)間。
get_transient($transient):從數(shù)據(jù)庫(kù)中檢索瞬時(shí)數(shù)據(jù)。
delete_transient($transient):從數(shù)據(jù)庫(kù)中刪除瞬時(shí)數(shù)據(jù)。
// 存儲(chǔ)數(shù)據(jù)
$data = '這是要存儲(chǔ)的數(shù)據(jù)';
set_transient( 'my_transient_data', $data, 3600 ); // 過(guò)期時(shí)間為1小時(shí)
// 檢索數(shù)據(jù)
$data = get_transient( 'my_transient_data' );
if ( false === $data ) {
// 如果數(shù)據(jù)不存在或已過(guò)期
// 執(zhí)行代碼來(lái)生成數(shù)據(jù)
$data = '這是新生成的數(shù)據(jù)';
set_transient( 'my_transient_data', $data, 3600 ); // 存儲(chǔ)新生成的數(shù)據(jù)
}
// 輸出數(shù)據(jù)
echo $data;
將此方法,用到需要和數(shù)據(jù)庫(kù)打交道的地方,首先先去獲取一下有沒(méi)有緩存數(shù)據(jù),沒(méi)有再進(jìn)行查詢。這樣就不需要直接查詢數(shù)據(jù)庫(kù)了。
在CorePress Pro重構(gòu)版主題里面,我將這個(gè)方法抽象出成了一個(gè)類(lèi)公共方法,方便調(diào)用。
方法是先查詢是否有緩存,沒(méi)有的話,調(diào)用一個(gè)回調(diào)方法,這個(gè)回調(diào),調(diào)用此函數(shù)的地方寫(xiě)入即可。
static function Cache($key, $call_back, $forced_update = false)
{
if ($forced_update === true) {
$data = call_user_func($call_back);
set_site_transient($key, $data, 3600);
} else {
$data = get_site_transient($key);
if ($data === false) {
$data = call_user_func($call_back);
set_site_transient($key, $data, 3600);
}
}
return $data;
}
例如,在文章首頁(yè),要調(diào)用查詢文章列表的時(shí)候,直接這樣賦值,就無(wú)需判斷是否過(guò)期,非常簡(jiǎn)單方便。
$post_list = Theme::Cache('home_post_list_query_' . $paged, function () use ($paged) {
return WordPress::getPostList($paged);//查詢文章的方法
});
后續(xù)如果要拓展更多的緩存功能,只需要修改Cache函數(shù),而不影響其他寫(xiě)好的代碼。
也希望更多的插件和主題能用上緩存機(jī)制,為WordPress減少負(fù)擔(dān)。