摘要 最后修改:2020年8月18日閱讀時(shí)間:觀點(diǎn)網(wǎng)站的性能通常圍繞緩存的概念展開:將數(shù)據(jù)存儲(chǔ)在就緒且可快速訪問的狀態(tài)下,以便瀏覽器更快地復(fù)制它。WordPressTransientsAPI是用于緩存的工具,以及一種提高WordPress網(wǎng)站性能的強(qiáng)大方法。每當(dāng)瀏覽器請(qǐng)求網(wǎng)頁(yè)時(shí),服務(wù)服務(wù)器必須進(jìn)行許多復(fù)雜且耗時(shí)的計(jì)算,導(dǎo)致延誤。執(zhí)行查詢后,得益于緩
自動(dòng)刪除
手動(dòng)刪除
遠(yuǎn)程API響應(yīng)
本地API響應(yīng)
基本用法
基本范例
更復(fù)雜的例子
目錄
最后修改: 2020年8月18日
閱讀時(shí)間:
觀點(diǎn)
網(wǎng)站的性能通常圍繞緩存的概念展開:將數(shù)據(jù)存儲(chǔ)在就緒且可快速訪問的狀態(tài)下, 以便瀏覽器更快地復(fù)制它。 WordPress Transients API是用于緩存的工具, 以及一種提高WordPress網(wǎng)站性能的強(qiáng)大方法。
每當(dāng)瀏覽器請(qǐng)求網(wǎng)頁(yè)時(shí), 服務(wù)服務(wù)器必須進(jìn)行許多復(fù)雜且耗時(shí)的計(jì)算, 導(dǎo)致延誤。 執(zhí)行查詢后, 得益于緩存技術(shù), 服務(wù)器可以記住最終結(jié)果,并且在第二次請(qǐng)求時(shí), 將其提供給瀏覽器,而無(wú)需再次進(jìn)行相同的計(jì)算。 所以, 緩存和重用早期資源的能力對(duì)于優(yōu)化性能至關(guān)重要。
非常簡(jiǎn)單的緩存提供了將信息臨時(shí)存儲(chǔ)在緩存層中的選項(xiàng)。
緩存有不同的類型,結(jié)合使用它們, 您將獲得更高的性能水平。
在打開網(wǎng)頁(yè)內(nèi)容之前, 您的瀏覽器需要一堆東西,例如JavaScript文件, 樣式表, 字體, 等等 除了頁(yè)面內(nèi)容外,它還會(huì)下載所有這些內(nèi)容。
如果瀏覽器緩存了這些文件, 每次加載網(wǎng)站時(shí)都無(wú)需下載它們。 首次加載該網(wǎng)站通常需要幾秒鐘, 但是在瀏覽器緩存了這些文件之后, 加載時(shí)間大大減少。
服務(wù)器緩存是指為特定頁(yè)面保存HTML文件,并在隨后的每個(gè)請(qǐng)求中使用。 這就是所謂的全頁(yè)緩存。
服務(wù)器緩存還有另一種類型-對(duì)象緩存, 哪個(gè), 與全頁(yè)緩存不同, 僅緩存某些信息(片段)。
被認(rèn)為是最有效的緩存。 它的名稱對(duì)它的工作方式不言而喻。 當(dāng)用戶“ A”訪問網(wǎng)頁(yè)時(shí), 網(wǎng)站將對(duì)其進(jìn)行構(gòu)建,并將其內(nèi)容返回給用戶的瀏覽器。 在頁(yè)面緩存運(yùn)行的情況下, 保存此頁(yè)面內(nèi)容,以便當(dāng)用戶“ B”訪問同一頁(yè)面時(shí), 頁(yè)面緩存會(huì)重現(xiàn)以前發(fā)送的內(nèi)容。
頁(yè)面緩存的最大優(yōu)點(diǎn)是,緩存的頁(yè)面幾乎在訪問時(shí)返回。 因此, 即使在性能最差,CPU使用率最低的最弱服務(wù)器上,也要處理數(shù)百萬(wàn)個(gè)請(qǐng)求并重現(xiàn)頁(yè)面。
但是這種類型的緩存也有其缺點(diǎn):例如, 無(wú)法為授權(quán)用戶緩存頁(yè)面, 或針對(duì)其頁(yè)面內(nèi)容取決于當(dāng)前用戶變量的用戶。
數(shù)據(jù)庫(kù)緩存是計(jì)算機(jī)應(yīng)用程序設(shè)計(jì)中包含的過程,該過程通過訪問后端數(shù)據(jù)庫(kù)按需(動(dòng)態(tài))生成網(wǎng)頁(yè)。 數(shù)據(jù)庫(kù)緩存通過消除不必要的壓力來增強(qiáng)主數(shù)據(jù)庫(kù), 通常以經(jīng)常訪問的讀取數(shù)據(jù)的形式。 緩存本身可以在多個(gè)區(qū)域中運(yùn)行,包括您的數(shù)據(jù)庫(kù), 應(yīng)用程序或作為獨(dú)立層。
當(dāng)這些應(yīng)用程序部署在涉及基于瀏覽器的客戶端的多層環(huán)境中時(shí), Web應(yīng)用程序服務(wù)器和后端數(shù)據(jù)庫(kù), 中間層數(shù)據(jù)庫(kù)緩存用于實(shí)現(xiàn)高可伸縮性和性能。
WordPress中的對(duì)象緩存(對(duì)象緩存)涉及存儲(chǔ)數(shù)據(jù)庫(kù)查詢。 它是一種內(nèi)置的系統(tǒng)機(jī)制,可讓您保存任何類型的數(shù)據(jù)(對(duì)象)并在必要時(shí)進(jìn)行檢索。 該緩存用于存儲(chǔ)復(fù)雜操作的結(jié)果。
在您的WordPress網(wǎng)站上啟用后, 它有助于加快PHP執(zhí)行時(shí)間, 更快地向網(wǎng)站訪問者提供內(nèi)容, 并減少數(shù)據(jù)庫(kù)的負(fù)載。
它是一個(gè)地理上分散的網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu),可向Web服務(wù)和站點(diǎn)的用戶提供快速的內(nèi)容交付。 CDN中包含的服務(wù)器在地理位置上以使站點(diǎn)/服務(wù)用戶的響應(yīng)時(shí)間最小的方式定位。
瞬態(tài)API是存儲(chǔ)信息塊(代碼串, HTML內(nèi)容 WP_Query對(duì)象, 網(wǎng)站的數(shù)據(jù)庫(kù)中的JSON),而不是瀏覽器緩存。 Transients API與Options API非常相似, 但主要區(qū)別在于Transients API 有到期時(shí)間 或更好的說壽命。
瞬態(tài)的三個(gè)主要操作是 設(shè)定值, 獲得價(jià)值 和刪除值 :
set_transient($ key, $ value, $ expires);
要設(shè)置瞬態(tài),可以使用set_transient()函數(shù),該函數(shù)包含三個(gè)組件:
鑰匙 –瞬態(tài)的短唯一名稱。 長(zhǎng)度不得超過172個(gè)字符。
價(jià)值 –包含將存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息的任何類型的PHP變量。
到期時(shí)間(壽命)– 信息將存儲(chǔ)的時(shí)間量。
因此,例如,如果我們要保存一天的列表帖子查詢,請(qǐng)執(zhí)行以下操作:
set_transient('unique_listing_posts_query_results_name',
$ listing_posts_query_results, DAY_IN_SECONDS);
如您所見,我們使用了WordPress 3中引入的幾種(DAY_IN_SECONDS)時(shí)間常數(shù)。5,輕松表達(dá)時(shí)間。 這是所有時(shí)間常數(shù)的完整列表:
MINUTE_IN_SECONDS= 60(秒)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
get_transient($ key);
為了獲得一個(gè)保存的瞬態(tài),我們可以使用
get_transient($ transient_name);
在我們的情況下,我們可以通過以下方式獲取列出查詢結(jié)果的帖子:
get_transient( 'unique_listing_posts_query_results_name' );
在后面的示例部分中,我們將對(duì)此進(jìn)行詳細(xì)介紹。
delete_transient($ key);
正如我們?cè)谇懊娴男」?jié)中所解釋的,我們可以使用Transients API來獲取和存儲(chǔ)對(duì)數(shù)據(jù)庫(kù)的遠(yuǎn)程或本地(內(nèi)容或來自數(shù)據(jù)庫(kù)的查詢)響應(yīng)。
然而, 這是一個(gè)問題 我們?nèi)绾蝿h除舊的存儲(chǔ)內(nèi)容(瞬態(tài))。 有兩種清除(刪除)瞬態(tài)的方法:
自動(dòng)刪除
關(guān)于瞬態(tài)的很酷的事情是,如果我們 設(shè)置到期時(shí)間(壽命) 。 如果您試圖在瞬態(tài)過期后從數(shù)據(jù)庫(kù)中檢索瞬態(tài), WordPress會(huì)自動(dòng)將其刪除, 防止任何混亂。一旦有人打開網(wǎng)站,瞬態(tài)將被重新創(chuàng)建。 這樣,我們可以確保從遠(yuǎn)程或本地API獲得新鮮的內(nèi)容。
手動(dòng)刪除
有時(shí),我們需要通過手動(dòng)刪除瞬變來強(qiáng)制其過早死亡。 在進(jìn)行給定活動(dòng)(添加新菜單項(xiàng), 保存或更新帖子, 添加或更新類別等)將使緩存的數(shù)據(jù)本來就過時(shí)并且需要更新:
我們必須使用的功能是
delete_transient($ transient_name)
在我們的情況下應(yīng)該是:
delete_transient( 'unique_listing_posts_query_results_name' );
筆記: 重要的是不要使用瞬態(tài)來存儲(chǔ)無(wú)法重新創(chuàng)建的有價(jià)值的數(shù)據(jù)!
只要我們的計(jì)算密集型值不經(jīng)常更改并且想要緩存,就可以使用Transients API。 在WordPress中, 這通常是數(shù)據(jù)庫(kù)查詢的結(jié)果對(duì)象, 但實(shí)際上可以是您存儲(chǔ)在變量中的任何內(nèi)容, 是否為標(biāo)量值, 數(shù)組或?qū)ο蟆?/p>
因此,當(dāng)您在主題和插件中執(zhí)行復(fù)雜的查詢時(shí),所有瞬變都是很棒的。
遠(yuǎn)程API響應(yīng)
遠(yuǎn)程API始終會(huì)對(duì)遠(yuǎn)程服務(wù)器進(jìn)行多次調(diào)用或請(qǐng)求,并且存在一些額外的延遲。 這會(huì)花費(fèi)時(shí)間并導(dǎo)致延遲。 還, 一些遠(yuǎn)程API可能有速率限制, 表示您可以在給定的時(shí)間內(nèi)達(dá)到最大請(qǐng)求數(shù)限制。
如您所知, 我們可以利用Transients API來緩存來自遠(yuǎn)程服務(wù)器的響應(yīng)(結(jié)果)并將其存儲(chǔ)在我們的數(shù)據(jù)庫(kù)中。 現(xiàn)在我們可以使用
get_transient();
方法,并在需要時(shí)顯示存儲(chǔ)的(緩存的)結(jié)果/內(nèi)容,而無(wú)需進(jìn)行其他遠(yuǎn)程調(diào)用或請(qǐng)求。
所有這些將:
減少遠(yuǎn)程HTTPS調(diào)用和請(qǐng)求
減少CPU服務(wù)器使用率
縮短網(wǎng)站頁(yè)面加載時(shí)間
本地API響應(yīng)
–基本上是數(shù)據(jù)庫(kù)的HTML或查詢結(jié)果。 您不僅可以將Transients API用于緩存遠(yuǎn)程響應(yīng),還可以將HTML內(nèi)容或查詢結(jié)果存儲(chǔ)在本地?cái)?shù)據(jù)庫(kù)中。 如果您想在網(wǎng)站上顯示可重復(fù)的HTML部分(小部件, 滑塊, 菜單 等等。),或者只是為了防止每次有人訪問您的網(wǎng)站時(shí)觸發(fā)復(fù)雜或緩慢的數(shù)據(jù)庫(kù)查詢。
復(fù)雜和自定義的數(shù)據(jù)庫(kù)查詢
WordPress導(dǎo)航菜單
側(cè)欄小部件,顯示信息,例如; 鳴叫, 最近的網(wǎng)站訪問者列表或特定類別的帖子列表
緩存標(biāo)簽云
緩存外部HTTP請(qǐng)求
經(jīng)過如此多的解釋,現(xiàn)在該是一個(gè)真實(shí)的例子了。
基本用法
函數(shù)get_my_data(){
$ data = get_transient('my_transient_name');
if(false === $ data){//瞬態(tài)已過期/尚未設(shè)置
$ data = fetch_my_data(); //從原始來源提取數(shù)據(jù)
set_transient('my_transient_name', $ data, HOUR_IN_SECONDS);
}
返回$ data;
}
fetch_my_data() 功能可以存儲(chǔ) WP_Query對(duì)象, json數(shù)據(jù), html內(nèi)容 , 等等。
基本范例
正如我們已經(jīng)解釋的那樣,這種類型的緩存非常適合保存長(zhǎng)時(shí)間操作的結(jié)果, 最簡(jiǎn)單的示例是訪問外部API, 例如Facebook。
假設(shè)我們具有以下功能, 可以訪問Facebook API, 請(qǐng)求一個(gè)對(duì)象(更確切地說, 頁(yè)面)您的網(wǎng)站。url并返回該頁(yè)面的點(diǎn)贊次數(shù):
function get_facebook_likes() {
$ result = wp_remote_get('https:// graph。Facebook。com /您的網(wǎng)站。url');
$ result = json_decode(wp_remote_retrieve_body($ result));
返回$ result->喜歡
}
回顯“ Facebook喜歡:”。 get_facebook_likes();
此函數(shù)的執(zhí)行時(shí)間取決于許多因素, 包括您的服務(wù)器相對(duì)于Facebook服務(wù)器的位置, 狀態(tài), 和網(wǎng)絡(luò)的速度, 等等。 一般, 一個(gè)功能可能需要1-3秒。
這意味著在網(wǎng)站上使用此功能時(shí), 每頁(yè)的加載時(shí)間將增加1-3秒。 而且, 如果我們?cè)?00秒內(nèi)調(diào)用此函數(shù)500次以上, Facebook將開始生成錯(cuò)誤而不是結(jié)果。
為了加快此功能, 我們可以使用WordPress Transients API并將結(jié)果保存1小時(shí):
function get_facebook_likes() {
if ( false===( $likes=get_transient( 'fb_likes' ) ) ) {
$ result = wp_remote_get('https:// graph。Facebook。com /您的網(wǎng)站。url');
$ result = json_decode(wp_remote_retrieve_body($ result));
$ likes = $ result->喜歡
//將瞬態(tài)設(shè)置為一個(gè)小時(shí)(以秒為單位)
set_transient('fb_likes', $贊, 1 * HOUR_IN_SECONDS);
}
返回$ likes;
}
因此, 第一次調(diào)用此函數(shù)時(shí), 收到Facebook的請(qǐng)求后, WordPress會(huì)將結(jié)果寫入數(shù)據(jù)庫(kù),將來將在一個(gè)小時(shí)內(nèi)從數(shù)據(jù)庫(kù)返回此結(jié)果,而無(wú)需向Facebook服務(wù)器重復(fù)請(qǐng)求。 一個(gè)小時(shí)后, 該功能將再次轉(zhuǎn)到Facebook獲取數(shù)據(jù)。
通過這種方法, 每小時(shí)只有一次對(duì)此功能的調(diào)用將使請(qǐng)求時(shí)間增加1-3秒, 隨后的電話將立即發(fā)出。
更復(fù)雜的例子
想象一下,我們有一個(gè)包含大約100個(gè)類別和大約50000個(gè)帖子的網(wǎng)站, 在網(wǎng)站的單個(gè)帖子設(shè)計(jì)中,我們有一個(gè)小部件,可顯示當(dāng)前帖子所在類別中的N個(gè)相關(guān)帖子。 不出所料 這個(gè)復(fù)雜的查詢需要一些時(shí)間才能從數(shù)據(jù)庫(kù)中獲取結(jié)果并將其顯示在網(wǎng)站上。
現(xiàn)在,假設(shè)您有10,000個(gè)用戶同時(shí)訪問該網(wǎng)站。 這意味著我們將有10,000多個(gè)數(shù)據(jù)庫(kù)請(qǐng)求必須執(zhí)行查詢(這是一個(gè)復(fù)雜的查詢,因?yàn)樗鼘⑺阉髡麄€(gè)數(shù)據(jù)庫(kù)wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts表 , 因此他們有超過1萬(wàn)個(gè)查詢), 從相關(guān)類別中獲取N條帖子的結(jié)果,并將其顯示在前端。 這, 反過來, 會(huì)使數(shù)據(jù)庫(kù)超載并延遲網(wǎng)站的整體加載時(shí)間, 在某些情況下,甚至由于數(shù)據(jù)庫(kù)超載而使它崩潰。
接下來的問題是如何優(yōu)化和減少數(shù)據(jù)庫(kù)查詢和請(qǐng)求的數(shù)量。 為什么每次我們都可以利用Transients API并僅緩存查詢對(duì)象或緩存整個(gè)HTML輸出時(shí),都有這么多查詢? 這樣,我們將減少和優(yōu)化數(shù)據(jù)庫(kù)查詢的數(shù)量, 這將帶來更好的網(wǎng)站性能和更好的用戶體驗(yàn)。
在我們的情況下,查詢將在 wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts表 獲得所有預(yù)期的結(jié)果。
這是我們?nèi)绾瓮瓿纱瞬僮鞯耐暾纠?/p>
function show_posts_from_category() {
$ args = array(
'貓'=> 555, //隨機(jī)類別ID
'posts_per_page'=> 8, //隨機(jī)顯示相關(guān)帖子
'No_found_rows'=> 真的,
);
$hash=md5( $args['cat'] ); //類別ID的MD5哈希
$ transient_key ='category-'。 $ hash; //瞬態(tài)鍵
if(false ===(($ posts_from_category_html = get_transient($ transient_key))))://瞬變已過期/尚未設(shè)置
$ the_query =新的WP_Query($ args); //獲取查詢
ob_start(); //打開輸出緩沖
而($ the_query->have_posts()):$ the_query->the_post();
?>
div class =“ item”>
div class =“ bigthumb”>
href =“ https:// devrix。com / tutorial / transients-api /?PHP的the_permalink();?>“ rel =” bookmark“ title =”?PHP的the_title();?>”> ?PHP的如果(has_post_thumbnail())the_post_thumbnail('big-thumb');?>/一種>
/ div>
33>href =“ https:// devrix。com / tutorial / transients-api /?PHP的the_permalink();?>“ rel =” bookmark“ title =”?PHP的the_title();?>”>?PHP的the_title();?>/一種>/小時(shí)3>
?PHP的the_excerpt();?>
/ div>
?的PHP
結(jié)束
$ post_from_category_html = ob_get_contents(); //獲取輸出緩沖區(qū)的內(nèi)容而不清除它
ob_end_clean(); //關(guān)閉此輸出緩沖
set_transient($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); //將瞬態(tài)設(shè)置為15分鐘的到期時(shí)間
wp_reset_postdata();
萬(wàn)一;
返回$ post_from_category_html;
}
緩存是加快處理速度的好方法, 但您必須確切知道要緩存的內(nèi)容, 在哪里可以做, 何時(shí)何地, 否則,您將面臨面臨意外后果的風(fēng)險(xiǎn)。
如果您不確定某項(xiàng)功能是否按預(yù)期工作, 總是轉(zhuǎn)向分析-查看針對(duì)數(shù)據(jù)庫(kù)的每個(gè)查詢, 查看所有PHP函數(shù)調(diào)用, 時(shí)間和內(nèi)存使用情況。
Transients API是優(yōu)化WordPress網(wǎng)站的加載時(shí)間并提供出色的用戶體驗(yàn)的好方法。 在插件和主題中使用瞬態(tài)很簡(jiǎn)單,僅增加了幾行代碼。 如果在正確的情況下(例如長(zhǎng)數(shù)據(jù)庫(kù)查詢或復(fù)雜的處理數(shù)據(jù))使用它,可以節(jié)省站點(diǎn)上的加載時(shí)間幾秒鐘。
DevriX是一家提供全方位服務(wù)的WordPress開發(fā)機(jī)構(gòu)。 我們不僅提供Web開發(fā)服務(wù),而且還提供專家團(tuán)隊(duì),可以為您建立在線形象的每個(gè)步驟提供建議。
瀏覽更多:開發(fā)WordPress開發(fā)
Vladislav是DevriX的后端開發(fā)人員,并且是WordPress核心貢獻(xiàn)者。 他擁有10多年的開發(fā)經(jīng)驗(yàn),但每天都在努力應(yīng)對(duì)新挑戰(zhàn),以提高自己的開發(fā)技能。 在他空閑的時(shí)候, 他跟隨他最喜歡的電視連續(xù)劇, 與朋友一起踢足球,并與家人共度時(shí)光。