WEB主題公園
WordPress原創(chuàng)主題,高端網(wǎng)站模板建站,網(wǎng)站模板建站資源以及開(kāi)發(fā)知識(shí)分享,盡在WEB主題公園
WEB主題公園致力于開(kāi)發(fā)適合中國(guó)人習(xí)慣的中文WordPress網(wǎng)站模板,并提供全程視頻教程,讓您能夠輕松的使用網(wǎng)站模板建立好自己的網(wǎng)站!
利用WordPress 對(duì)象緩存超級(jí)加速
WordPress本身自帶的對(duì)象緩存機(jī)制
WordPress Object Cache(WordPress 對(duì)象緩存)是 WordPress 的默認(rèn)緩存機(jī)制,它的主要功能是把負(fù)責(zé)查詢或者運(yùn)算的結(jié)果按照 Key-Value 這樣的方式(WordPress 還支持按照 Group 來(lái)劃分和避免緩存的內(nèi)容沖突)存儲(chǔ)到對(duì)象里面,下次進(jìn)行同樣操作的時(shí)候,可以讓直接從這個(gè)對(duì)象中取出數(shù)據(jù),不用重復(fù)到數(shù)據(jù)庫(kù)中或者其他外部網(wǎng)站獲取數(shù)據(jù)。
而這個(gè)緩存機(jī)制需要你的服務(wù)器支持內(nèi)存緩存,如果服務(wù)器支持內(nèi)存緩存,那么這些被緩存的數(shù)據(jù),將會(huì)直接緩存在你的服務(wù)器內(nèi)存中,用戶訪問(wèn)網(wǎng)站時(shí)會(huì)直接讀取,而非查詢數(shù)據(jù)庫(kù),這樣帶來(lái)的好處是極大的減少了網(wǎng)站訪問(wèn)對(duì)數(shù)據(jù)庫(kù)的查詢次數(shù),從而能夠很大程度改善服務(wù)器壓力,對(duì)于訪問(wèn)量非常大的網(wǎng)站來(lái)說(shuō),這個(gè)機(jī)制是非常高效的。
Memcached的開(kāi)啟以及自身WordPress主題程序的支持
Memcached 是一種高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng)。在動(dòng)態(tài)應(yīng)用,Memcached 既能提高訪問(wèn)的速度,同時(shí)還減低了數(shù)據(jù)庫(kù)的負(fù)載。如果你的服務(wù)器能夠支持Memcached 緩存,那么可以從你所使用的主題進(jìn)行內(nèi)存優(yōu)化。
網(wǎng)上有很多的教程教你如何打開(kāi)Memcached 緩存,但是大部分教程并沒(méi)有說(shuō)明,開(kāi)啟之后我們?nèi)绾螌⑦@個(gè)緩存機(jī)制達(dá)到最佳的緩存水平。
在開(kāi)起了內(nèi)存緩存之后,我們需要通過(guò)WordPress Object Cache(WordPress 對(duì)象緩存)這個(gè)機(jī)制,將我們網(wǎng)站的大部分內(nèi)容緩存起來(lái),讓用戶訪問(wèn)時(shí),通過(guò)緩存反饋給用戶,這樣才能最大程度發(fā)揮Memcached 緩存的作用。
WEB主題公園官網(wǎng)內(nèi)存緩存優(yōu)化過(guò)程紀(jì)實(shí)
隨著WEB主題公園官網(wǎng)的內(nèi)容不斷增加,訪問(wèn)量也增加的很快,之前對(duì)網(wǎng)站所做的一些優(yōu)化慢慢的就不夠用了。在訪問(wèn)量非常高的時(shí)候,服務(wù)器的內(nèi)存經(jīng)常報(bào)警,并一度達(dá)到90%的內(nèi)存使用,甚至帶來(lái)了一次因內(nèi)存達(dá)到100%的宕機(jī),對(duì)此網(wǎng)站的整個(gè)優(yōu)化刻不容緩。
因此,我們對(duì)服務(wù)器進(jìn)行了優(yōu)化,并且在此基礎(chǔ)上,對(duì)網(wǎng)站主題進(jìn)行了一次內(nèi)存使用的優(yōu)化,效果非常明顯。 長(zhǎng)期處于報(bào)警的邊緣的內(nèi)存使用降低了100%,并且速度有了非常明顯的提升,從之前所有頁(yè)面打開(kāi)需費(fèi)時(shí)2秒的情況。降低到1秒左右:

利用WordPress的對(duì)象緩存,對(duì)整個(gè)網(wǎng)站的輸出進(jìn)行緩存處理
使用 WordPress 對(duì)象緩存技術(shù)包括下面幾個(gè)函數(shù)使用的方法,過(guò)程為數(shù)據(jù)儲(chǔ)存----數(shù)據(jù)讀取----數(shù)據(jù)刪除 三個(gè)步驟。
使用 wp_cache_set() 把數(shù)據(jù)寫(xiě)到緩存中,這樣讓用戶訪問(wèn)不必讓程序讀取數(shù)據(jù)庫(kù)。
使用 wp_cache_get() 到緩存中讀取數(shù)據(jù),速度增快,沒(méi)有數(shù)據(jù)庫(kù)查詢的過(guò)程。
使用 wp_cache_delete() 刪除緩存,在文章或者網(wǎng)頁(yè)更新時(shí),刪除相關(guān)的數(shù)據(jù)緩存,并進(jìn)行更新,讓用戶能夠訪問(wèn)到最新的數(shù)據(jù)。
這個(gè)機(jī)制非常簡(jiǎn)單,你可以最大范圍的緩存你的各個(gè)頁(yè)面,文章和分類,緩存時(shí),既可以在循環(huán)內(nèi)緩存,也可以直接將一組較大的數(shù)據(jù)緩存。
以這一次WEB主題公園的優(yōu)化為例,WEB主題公園的新官網(wǎng)是采用小工具進(jìn)行排版的,首頁(yè)的組成是 網(wǎng)站頭部?? + 網(wǎng)站底部 + 三個(gè)小工具位置(上面一個(gè)一欄的小工具輸出。下一個(gè)70%寬度小工具和一個(gè)27%寬度小工具組成),頭部和底部主要是一些菜單,這些可以使用 WordPress 3.9 之后,提供的pre_wp_nav_menu filter 接口進(jìn)行緩存(下面將會(huì)介紹)。而三個(gè)小工具我們依次直接緩存。
緩存一個(gè)輸出類型的php函數(shù)
我們知道,WordPress的小工具輸出,是WordPress函數(shù)dynamic_sidebar進(jìn)行輸出的,而WordPress的緩存函數(shù),需要對(duì)一個(gè)變量進(jìn)行賦值,并使用函數(shù)緩存:
wp_cache_set(‘緩存的id(識(shí)別號(hào))’,'緩存的數(shù)據(jù)變量','緩存的名稱',緩存過(guò)期時(shí)間)
如果我們直接將dynamic_sidebar賦值給一個(gè)變量,是無(wú)法賦值的,所以我們需要php的緩沖區(qū)進(jìn)行賦值。php的緩沖區(qū)功能由ob_start()、ob_get_contents()和??? ob_end_clean()組成,請(qǐng)查看下面的代碼:
ob_start();//打開(kāi)一個(gè)緩沖區(qū),打開(kāi)之后下面的輸出將會(huì)暫緩輸出。
dynamic_sidebar('sidebar-widgets')//輸出小工具的函數(shù),但在前面打開(kāi)緩沖區(qū)之后,他會(huì)暫緩輸出
wp_cache_set('sidebars1',ob_get_contents(),'sidebar_content1');//WordPress的內(nèi)存緩存寫(xiě)入,我們利用函數(shù)ob_get_contents()對(duì)內(nèi)存緩存的數(shù)據(jù)進(jìn)行賦值,
ob_end_clean();//關(guān)閉并清理緩沖區(qū),這時(shí)我們的緩存已經(jīng)寫(xiě)入了,因此關(guān)閉緩沖區(qū)并清理。
上面的代碼完成了將整個(gè)小工具進(jìn)行緩存的實(shí)例,這樣我們通過(guò)使用變量賦值進(jìn)行輸出:
$sidebar_content = wp_cache_get('sidebars','sidebar_content') ;
echo ?? $sidebar_content ;
現(xiàn)在小工具是緩存過(guò)的內(nèi)存進(jìn)行的輸出了,而無(wú)需查詢數(shù)據(jù)庫(kù),當(dāng)WEB主題公園的三個(gè)小工具進(jìn)行緩存之后,數(shù)據(jù)庫(kù)查詢由之前的201次查詢,降低到了57次查詢。這無(wú)疑大大降低了服務(wù)器的壓力,并且速度也有所提升,緩存輸出之后,頁(yè)面打開(kāi)時(shí)間縮減到了1.453秒。
對(duì)WordPress網(wǎng)站上所有的菜單進(jìn)行緩存
三個(gè)小工具進(jìn)行緩存之后,數(shù)據(jù)庫(kù)查詢?nèi)稳挥?7次之高,我們需要想辦法將查詢盡可能的降低,現(xiàn)在我們可以使用WordPress3.9之后出來(lái)的新接口,將菜單緩存。
以下代碼來(lái)源于我愛(ài)水煮魚(yú)博客,他提供了這個(gè)接口的完整代碼:
add_filter( 'pre_wp_nav_menu', 'wpjam_get_nav_menu_cache', 10, 2 );
function wpjam_get_nav_menu_cache( $nav_menu, $args ) {
$cache_key = wpjam_get_nav_menu_cache_key($args);
$cached_menu = get_transient( $cache_key );
if ( ! empty( $cached_menu ) )
return $cached_menu;
return $nav_menu;
}
add_filter( 'wp_nav_menu', 'wpjam_set_nav_menu_cache', 10, 2 );
function wpjam_set_nav_menu_cache( $nav_menu, $args ) {
$cache_key = wpjam_get_nav_menu_cache_key($args);
set_transient( $cache_key, $nav_menu, 86400 );
return $nav_menu;
}
function wpjam_get_nav_menu_cache_key($args){
$timestamp = get_transient('nav-menu-cache-timestamp');
if($time === false){
$timestamp = time();
set_transient( 'nav-menu-cache-timestamp', $time, 86400 );
}return apply_filters( 'nav_menu_cache_key' , 'nav-menu-' . md5( serialize( $args ).serialize(get_queried_object()) ) . $timestamp );}
// 更新菜單,清理緩存
add_action( 'wp_update_nav_menu', 'wpjam_delete_nav_menu_cache' );
function wpjam_delete_nav_menu_cache( $menu_id, $menu_data){
set_transient( 'nav-menu-cache-timestamp', time(), 86400 );
}
將這些函數(shù)放入functions.php中,菜單就自動(dòng)進(jìn)行了內(nèi)存緩存,現(xiàn)在終于達(dá)到了我們想要的要求,首頁(yè)查詢降低到了19次,打開(kāi)時(shí)間降低到了1.128秒。由于首頁(yè)的圖片非常多,
所以這個(gè)1.128秒的速度已經(jīng)是非常快的了。
分類目錄、頁(yè)面和文章頁(yè)的緩存工作
首頁(yè)的緩存做好之后,我們需要對(duì)其他頁(yè)面進(jìn)行緩存工作。
小工具和上面的使用方法一樣,緩存就行了,然后是列表、頁(yè)面和文章頁(yè)的循環(huán)中的數(shù)據(jù)進(jìn)行緩存。
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
//WordPress的循環(huán)
<?php endwhile; ?>
<?php else : ?>
<?php? endif; ?>
上面的代碼標(biāo)注了循環(huán)的位置,你現(xiàn)在可以將循環(huán)內(nèi)輸出的文章標(biāo)題、發(fā)布時(shí)間、摘要、正文、以及自定義字段進(jìn)行緩存,值得注意的是,緩存文章和頁(yè)面時(shí),你需要用文章或者頁(yè)面的id作為緩存的key,也就是標(biāo)識(shí)。
因此,下面的例子是緩存文章的標(biāo)題的方法,你可以以此類推緩存所有的內(nèi)容:
<?php if (have_posts()) : while (have_posts()) : the_post(); //循環(huán)開(kāi)始
$id =get_the_ID();//獲取文章的id
$tit=wp_cache_get($id ,'post_title');//將文章的緩存賦值給變量
if(!$tit){
//檢查剛才賦值的變量是否讀取到了緩存,
//如果沒(méi)有讀取到,那么進(jìn)行緩存,這也是緩存的一個(gè)更新機(jī)制
//如果刪除了緩存,那么會(huì)通過(guò)這個(gè)機(jī)制進(jìn)行重新緩存,達(dá)到更新緩存的效果
wp_cache_set($id,get_the_title(),'post_title');//緩存標(biāo)題
$tit=wp_cache_get($id ,'post_title');//重新賦值緩存給標(biāo)題
}?>
<?php echo $tit; //在相應(yīng)的地方輸出緩存 ?>
<?php endwhile; ?>
<?php else : ?>
<?php? endif; ?>
優(yōu)化完成之后,速度打開(kāi)效果和服務(wù)器壓力降低的效果明顯
現(xiàn)在文章和內(nèi)容頁(yè)也全部進(jìn)了緩存,我們查看下實(shí)際的優(yōu)化效果:
頁(yè)面的打開(kāi)效率對(duì)比

其他的分類和文章也是差不多的效果,總體而言,整個(gè)網(wǎng)站所有頁(yè)面的查詢保持在30以下的狀態(tài),速度在1秒左右不會(huì)超過(guò)1.5秒,相比之前的加載速度有了質(zhì)的飛躍。
優(yōu)化完成之后第二天,服務(wù)器自動(dòng)釋放內(nèi)存之后,由之前的內(nèi)存占據(jù)到80%左右降低到32%上下,超過(guò)100%的降低和優(yōu)化,服務(wù)器基本上在大流量的情況之下保存非常小的壓力,再也不會(huì)隨時(shí)有宕機(jī)的危險(xiǎn)發(fā)生了。
總結(jié),以及使用內(nèi)存緩存所需要注意的
1.內(nèi)存緩存應(yīng)用范圍:看了上面的介紹很多朋友應(yīng)該非常動(dòng)心,也想要試一試,但是這里我們需要做一些說(shuō)明,那些網(wǎng)站是可以并且需要這個(gè)內(nèi)存緩存的。
門(mén)戶類網(wǎng)站,門(mén)戶類網(wǎng)站一般在首頁(yè)、分類等區(qū)域會(huì)有非常之多的內(nèi)容展示,調(diào)用各種不同的分類最新文章、置頂文章、熱門(mén)文章等等,組成了非常龐大數(shù)據(jù)展示,這樣的展示方式同時(shí)也是對(duì)數(shù)據(jù)庫(kù)查詢非常多的。
但是如果門(mén)戶類網(wǎng)站只是提供閱讀,而不需要用戶注冊(cè)登錄等功能,而是作為靜態(tài)展示,內(nèi)存緩存就可以基本無(wú)需使用了,你可以使用靜態(tài)化緩存插件?WP Super Cache,生成全靜態(tài)文件,基本上不會(huì)查詢數(shù)據(jù)庫(kù)了,所以也無(wú)需使用內(nèi)存緩存。
如果提供給用戶注冊(cè)登錄的門(mén)戶類網(wǎng)站,那么就很需要內(nèi)存緩存了(如WEB主題公園官網(wǎng)就是一個(gè)小型的門(mén)戶類網(wǎng)站,首頁(yè)和分類等區(qū)域都調(diào)用了非常多的分類文章。)
如果你的網(wǎng)站只是一般官網(wǎng),展示內(nèi)容不多,那么本身你的網(wǎng)站數(shù)據(jù)庫(kù)查詢也很少,也無(wú)需使用內(nèi)存緩存了。這類網(wǎng)站即使是提供給用戶注冊(cè)登錄,登錄的用戶不是很多,也無(wú)需使用的。
使用內(nèi)存緩存,除了服務(wù)器配置好Memcached 之外,你要確保你的服務(wù)器內(nèi)存足夠使用,若是使用512M內(nèi)存這種類型的服務(wù)器,就不要使用內(nèi)存緩存了,內(nèi)存緩存會(huì)將緩存保存在內(nèi)存中,若服務(wù)器內(nèi)存很小,而緩存的數(shù)據(jù)較多的話,很容易就會(huì)爆掉,而導(dǎo)致宕機(jī)。
WEB主題公園官網(wǎng)目前的優(yōu)化措施
由于WEB主題公園需要用戶登錄之后才能下載資源,所以每天登錄的人數(shù)也是比較多的,看教程和資料的非登錄訪客也非常多,所以WEB主題公園采用了2套優(yōu)化機(jī)制。
對(duì)于非登錄的訪客,他們所訪問(wèn)的是WP Super Cache所生成的全靜態(tài)文件,速度比較快,這個(gè)是很早之前所做的優(yōu)化。
對(duì)于登錄用戶,由于有一系列登錄之后的動(dòng)態(tài)功能需求,所以他們是直接訪問(wèn)的動(dòng)態(tài)文件,因此在服務(wù)器壓力較大時(shí),速度會(huì)很慢,所以我們此次使用了內(nèi)存緩存,大大提高了訪問(wèn)速度和效率,并且對(duì)服務(wù)器的壓力也大大減少。
鑒于這次的優(yōu)化效果比較明顯,所以將整個(gè)優(yōu)化過(guò)程分享給大家,希望能夠?qū)δ阌兴鶈l(fā)。
WEB主題公園主題的優(yōu)化同時(shí)進(jìn)行
內(nèi)存緩存在經(jīng)過(guò)官網(wǎng)優(yōu)化之后效果明顯,所以我們會(huì)在接下來(lái)的工作中,對(duì)一些需要優(yōu)化的主題,基本上是門(mén)戶類的主題進(jìn)行內(nèi)存緩存的功能添加,對(duì)于展示類,會(huì)依據(jù)他們的數(shù)據(jù)庫(kù)查詢次數(shù),進(jìn)行選擇性增加,畢竟大部分展示類本身數(shù)據(jù)庫(kù)查詢就很少,并且可以使用靜態(tài)化插件進(jìn)行優(yōu)化,所以并不需要內(nèi)存緩存,加上有可能反而會(huì)增加服務(wù)器負(fù)擔(dān),所以還請(qǐng)了解清楚。
主題增加的功能會(huì)增加緩存和刪除緩存的選項(xiàng),在主題更新此功能之后,請(qǐng)注意你是否需要這個(gè)功能進(jìn)行選擇,以免不必要的浪費(fèi)自己的服務(wù)器資源。
如未標(biāo)明出處,所有文章均為WEB主題公園原創(chuàng),如需轉(zhuǎn)載,請(qǐng)附上原文地址,感謝您的支持和關(guān)注。
本文地址:http://www.dengyin90.cn/lywordpressdxhccjjs.html
推薦閱讀
- 2016年2月4日
- 2013年8月10日
- 2013年7月29日
- 2016年11月29日
- 2012年8月30日
- 2017年3月16日
- 2015年6月25日




