內容更新於 — 2022-12-26 17:14
在 WordPress 生態系統中,Transients 是程式庫中很少被提及的那一塊;但是,對於開發人員來說,在編寫外掛或主題的程式碼類型中,Transients 可以大大提升程式庫的性能;尤其是當正要運行複雜的數據庫查詢,或者是調用不經常更改結果的外部 API,它將會直接提供調用臨時儲存的數據,這意味著頁面載入的速度會更快。
這篇文章將解釋什麼是 Transients ,它們又如何在 WordPress 中工作,以及如何在程式碼中運用 Transients 來提高主題和外掛的性能。
WordPress Transients API 是 WordPress 程式庫的一部分,允許外掛和主題的開發人員存儲快取資料。 而這些資料最終會過期,之後也會被自動刪除。
Transients 通常用來快取〖來自可能引入延遲的外部 API 請求〗的數據,或者是來自〖緩慢的資料庫查詢〗的數據,因為這些數據在每次頁面載入的時候會降低網站的性能。
在 WordPress 數據庫中,Transients 會被儲存成後綴為〖 wp_options
〗的檔案,很類似於 Options API;不過,兩者的區別在於 Transients 有時效性,時效過了就會自動被刪除,而 WordPress Options 則不會。
正因為 Transients 有時效性,所以,編寫程式碼應考慮並計算 Transients 的時效,在可能需要再次調用之前重新填充 Transients ,以防在發出請求時瞬態不再存在。
編寫 Transients 程式碼,有 3 個主要函數:包含 set_transient()
、get_transient()
以及 delete_transient()
,依序為〖設定 Transients〗、〖取得 Transients〗以刪除 Transients〗。
函數範例如下:
// Setting a value set_transient( $name, $value, $expiration ); // Accessing a value get_transient( $name ); // Removing a value delete_transient( $name );
舉個例子來示範 Transients 的工作原理,假設,你想要在網站顯示能夠每日自動更新的〖名人名言〗,Zen Quotes 是一個很棒的來源,不需要密鑰就可以透過 API 來取得服務。比如,Zen Quotes 提供了一組〖當日名言〗的 API 端點:https://zenquotes.io/api/today,我們可以透過 php 函式調用 API 來取得〖當日名言〗的實時更新,示範的函式如下:
$response = wp_remote_get( 'https://zenquotes.io/api/today ); $body = json_decode( wp_remote_retrieve_body( $response ) ); $quote = $body->q;
而這段程式碼可以放在主題的 php 檔案中,不過,這時候問題就來了,因為每次有訪客載入頁面的時候,它都會調用 API,這將會造成過多的 API 請求,此外,根據 API 的響應時間,還可能減慢頁面載入的速度。所以,更好的作法是使用 Transients 來確保只有當 Zen Quotes 提供的端點更新的時候才需要調用實時 API,於是,加入 Transients 的程式碼,來設定 Transients 的到期時間如下:
$response = wp_remote_get( 'https://zenquotes.io/api/today' ); $body = json_decode( wp_remote_retrieve_body( $response ) ); $quote = $body->q; set_transient( 'quote', $quote, DAY_IN_SECONDS );
以上的 Transients 程式碼是將將 Transients 設置為 24 小時到期(WordPress DAY_IN_SECONDS
)。
不過,事情還沒完,我們還要設定一個檢查機制告訴它:『只有在 Transients 到期的時候才需要調用實時 API。』,否則,前面設定的〖 24 小時到期〗也沒用,函式如下:
if( get_transient( 'quote' ) ) { $quote = get_transient( 'quote' ); } else { $response = wp_remote_get( 'https://zenquotes.io/api/today' ); $body = json_decode( wp_remote_retrieve_body( $response ) ); $quote = $body->q; set_transient( 'quote', $quote, DAY_IN_SECONDS ); }
的用法類似 ,至於 set_transient
和 get_transient
delete_transient
的用法則是:假設,想在 Transients 到期之前自動刪除它,可以使用以下命令:
delete_transient( 'quote' );
以下是常見的幾種 Transients 的深入使用。
WordPress 的數據庫查詢的優化做得很好,像是 WP_Query
。但是,如果要從 wp_postmeta
查詢大量數據,那麼,就會影響到前端網站載入的性能,尤其是擁有上萬或數十萬則文章的網站。
但是,如果這些文章並不是經常更改,就可以執行一次長時間運行的數據庫查詢,將查詢結果保存在 Transients ,並且為 Transients 設定到期時間,然後,從保存的 Transients 為每個頁面視圖執行查找,這將確保快速執行對該數據的後續調用,例如,可以設定瞬態的到期時間為一小時、一天甚至是更久的時間。
另一個常見的瞬態用法則是透過 API 調用外部資源。因為我們無法控制外部資源的響應速度甚至是持續可用性,於是,使用 Transients 可以更好地控制這種情況。就像前面的〖當日名言〗的案例,我們可以將遠端 API 返回的數據暫時保存在 Transients ,之後的頁面載入就可以從預先保存的 Transients 中讀取數據,而不是重新調用,需要考慮的則是數據更改的頻率。
假設, API 調用的是〖天氣〗,幾乎可說是需要分秒更新的資料,那麼, Transients 將無濟於事。但是,如果要查詢或調用的資料數小時更新即可,那 Transients 便有機會幫助提高網站的性能,也能確保獲得所需的新數據。
Transients 可以大大提高程式碼性能,尤其是需要經常使用長時間運行的查詢或執行的渲染阻塞請求,Transients 改善的是程式碼中的潛在性能。
至於使用 Transients 最大的缺點則是,即使已設定了到期時間,也不能保證在到期之前的 Transients 一定可用,因此,如果有需要在準確時間轉換的數據,那麼 Transients 可能不是最佳選擇。
Transients 最理想的作用是在於,需要提取大量數據或與外部資源的主題或外掛,並且將在高流量的網站上運行時,那麼,Transients 是一個有用的概念,去快取需要長時間或緩慢的操作,以便在不需要更新數據的前提下保持較高的網站性能。此外,日益複雜的程式碼中,Transients 也可以確保從複雜的程式庫中獲得最佳性能。
Copyright ©miriammibao.com all rights reserved|Designed by MiriamMibao温唯 Since 2014.