什麼是瞬態API?

已發表: 2020-12-16

網站性能通常圍繞緩存的思想:以就緒狀態且訪問速度更快的狀態存儲數據,以便瀏覽器更快地複制數據。 WordPress Transients API是一種緩存工具,是一種提高WordPress網站性能的強大方法。

什麼是緩存,為什麼要使用它?

每當瀏覽器請求網頁時,服務服務器都必須進行大量複雜且耗時的計算,這會導致延遲。 執行查詢後,借助緩存技術,服務器可以記住最終結果,並在第二次請求時將其提供給瀏覽器,而無需再次進行相同的計算。 因此,緩存和重用早期資源的能力對於優化性能至關重要。

非常簡單的緩存提供了將信息臨時存儲在緩存層中的選項。

緩存有哪些類型?

緩存有不同的類型,通過結合使用它們,您將獲得更高的性能。

緩存類型

瀏覽器緩存

打開網頁的內容之前,瀏覽器需要使用JavaScript文件,樣式表,字體等一堆東西,除了頁面內容外,還需要下載所有其他東西。

如果瀏覽器緩存了這些文件,則每次加載網站時都無需下載它們。 首次加載站點通常需要幾秒鐘,但是在瀏覽器緩存這些文件之後,加載時間將大大減少。

服務器緩存

服務器緩存是指為特定頁面保存HTML文件,並在以後的每個請求中使用。 這就是所謂的全頁緩存。

服務器緩存還有另一種類型-對象緩存,與全頁緩存不同,對象緩存僅緩存某些信息(片段)。

頁面緩存

被認為是最有效的緩存。 它的名稱對它的工作方式不言而喻。 當用戶“ A”訪問頁面時,網站將對其進行構建並將其內容返回給用戶的瀏覽器。 在頁面高速緩存運行的情況下,將保存此頁面內容,以便當用戶“ B”訪問同一頁面時,頁面高速緩存將復制先前發送的內容。

頁面緩存的最大優點是,緩存的頁面幾乎在訪問時返回。 結果,即使在內存速度最快,CPU使用率最低的最弱服務器上,也要處理數百萬個請求並重現頁面。

但是,這種類型的緩存也有其缺點:例如,無法為授權用戶或頁面內容取決於當前用戶變量的用戶緩存頁面。

數據庫緩存

數據庫緩存是計算機應用程序設計中包含的過程,該應用程序通過訪問後端數據庫按需(動態)生成網頁。 數據庫緩存通常通過以頻繁訪問的讀取數據的形式消除不必要的壓力,從而增強了主數據庫的功能。 緩存本身可以在多個區域中運行,包括數據庫,應用程序或作為獨立層。

當將這些應用程序部署在涉及基於瀏覽器的客戶端,Web應用程序服務器和後端數據庫的多層環境中時,將使用中間層數據庫緩存來實現高可伸縮性和性能。

對象緩存

WordPress中的對象緩存(對象緩存)涉及存儲數據庫查詢。 它是一種內置的系統機制,可讓您保存任何類型的數據(對象)並在必要時進行檢索。 該緩存用於存儲複雜操作的結果。

在您的WordPress網站上啟用後,它可以幫助加快PHP執行時間,更快地向網站訪問者提供內容並減少數據庫的負載。

CDN(內容交付網絡)

它是一個地理上分散的網絡基礎結構,可向Web服務和站點的用戶提供快速的內容交付。 CDN中包含的服務器在地理位置上以使站點/服務用戶的響應時間最小的方式定位。

WordPress中的什麼是Transients API?

Transients API是一種在網站數據庫中存儲信息塊(代碼字符串,HTML內容,WP_Query對象,JSON)的方法,而不是瀏覽器緩存。 Transients API與Options API非常相似,但主要區別在於Transients API具有有效期或更短的使用壽命。

瞬態的三個主要操作是設置值,獲取值和刪除值

1.設置瞬態–

 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.5中引入的幾個時間常數中的一個(DAY_IN_SECONDS)來輕鬆表示時間。 這是所有時間常數的完整列表:

 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

2.獲得瞬態–

 get_transient($ key);

要獲得保存的瞬變,我們可以使用

get_transient($ transient_name);

在我們的情況下,我們可以通過以下方式獲取列出查詢結果的帖子:

 get_transient( 'unique_listing_posts_query_results_name' );

在後面的示例部分中,我們將對此進行詳細介紹。

3.刪除瞬態–

 delete_transient($ key);

正如我們在前面的小節中所述,我們可以使用Transients API來獲取和存儲對數據庫的遠程或本地(內容或來自數據庫的查詢)響應。

但是,這裡出現了一個問題,即我們如何刪除舊的存儲內容(瞬態)。 有兩種清除(刪除)瞬態的方法:

自動刪除

關於瞬態的最酷的事情是,如果我們設置了失效時間(壽命) ,它們會自動失效。 如果您試圖在瞬態過期後從數據庫中檢索瞬態,WordPress將自動將其刪除,以防止混亂。 一旦有人打開網站,瞬態將被重新創建。 通過這種方式,我們可以確保從遠程或本地API獲得新鮮的內容。

手動刪除

有時,我們需要通過手動刪除瞬變來強制其過早死亡。 當給定的活動(添加新菜單項,保存或更新帖子,添加或更新類別等)會使緩存的數據固有地過時並且需要更新時,此功能很有用:

我們必須使用的功能是

delete_transient($ transient_name)

在我們的情況下應該是:

 delete_transient( 'unique_listing_posts_query_results_name' );

注意:重要的是不要使用瞬變來存儲無法重新創建的有價值的數據!

為什麼我們應該使用瞬態API?

只要我們的計算密集型值不經常更改且您想緩存,就可以使用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,請求一個對象(更確切地說是頁面)your-website.url,並返回該頁面的點贊次數:

 函數get_facebook_likes(){

$ result = wp_remote_get('https://graph.facebook.com/your-website.url');

$ result = json_decode(wp_remote_retrieve_body($ result));

返回$ result-> likes;

}

迴聲“ Facebook喜歡:”。 get_facebook_likes();

該功能的執行時間取決於許多因素,包括服務器相對於Facebook服務器的位置,狀態和網絡速度等。平均而言,一個功能可能需要1-3秒。

這意味著在站點上使用此功能時,每頁的加載時間將增加1-3秒。 此外,如果我們在500秒內調用此函數500次以上,Facebook將開始生成錯誤而不是結果。

為了加快此功能,我們可以使用WordPress Transients API並將結果保存1小時:

 函數get_facebook_likes(){
if(false ===($ likes = get_transient('fb_likes'))){
$ result = wp_remote_get('https://graph.facebook.com/your-website.url');
$ result = json_decode(wp_remote_retrieve_body($ result));
$ likes = $ result-> likes;

//將瞬態設置為一個小時(以秒為單位)
set_transient('fb_likes',$ likes,1 * HOUR_IN_SECONDS);
}

返回$ likes;
}

因此,當第一次調用此函數時,WordPress在收到Facebook請求後,會將結果寫入數據庫,以後將在一個小時內從數據庫返回此結果,而無需向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表中進行搜索,以獲取所有預期結果。

這是我們如何完成此操作的完整示例:

 函數show_posts_from_category(){
$ args =數組(
'cat'=> 555,//隨機類別ID
'posts_per_page'=> 8,//要顯示的相關帖子的隨機數
'No_found_rows'=>是,
);

$ hash = md5($ args ['cat']); //類別ID的MD5哈希
$ transient_key ='類別-'。 $ hash; //瞬態鍵

if(false ===($ posts_from_category_html = get_transient($ transient_key)))://瞬態已過期/尚未設置

$ the_query =新的WP_Query($ args); //獲取查詢

ob_start(); //打開輸出緩衝

while($ the_query-> have_posts()):$ the_query-> the_post();
?>
<div class =“ item”>
<div class =“ bigthumb”>
<a href="<?php the_permalink();?>“ rel =” bookmark“ title =” <?php the_title();?>“> <?php if(has_post_thumbnail())the_post_thumbnail('big-thumb' ); ?> </a>
</ div>
<h3> <a href="<?php the_permalink();?>“ rel =” bookmark“ title =” <?php the_title();?>“> <?php the_title(); ?> </a> </ h3>
<?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網站的加載時間並提供出色的用戶體驗的好方法。 在插件和主題中使用瞬態很簡單,僅增加了幾行代碼。 如果在適當的情況下(例如長數據庫查詢或複雜的處理數據)使用它,可以節省站點上的加載時間幾秒鐘。