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