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