WordPress 中的瞬變指南
已發表: 2023-02-12作為 WordPress 開發人員,您可能已經知道性能對於一個成功的網站有多麼重要。 然而,了解 WordPress 中的瞬變以及它們如何幫助您優化項目可能有點棘手。
幸運的是,當您將它們分解時,瞬變並沒有那麼難理解。 只要牢記一些關鍵準則,您就可以順利地將它們整合到下一個 WordPress 插件中。
在這篇文章中,我們將概述什麼是 WordPress 瞬變,以及如何以及何時使用它們。 有很多基礎要覆蓋,所以讓我們開始吧!
什麼是 WordPress 瞬變?
為了理解瞬態,了解一些緩存和應用程序編程接口 (API) 的基本知識會很有幫助。
緩存網頁數據本質上是一種臨時保存網站數據的方式,這樣如果對同一數據有多個請求,網站就不必重新運行 MySQL 或 PHP。 這可以節省數秒的時間並減少服務器負載。
這個想法是暫時保留數據,因此有了“瞬態”這個詞。 Transients API 類似於 WordPress Options API。 您為數據指定一個名稱和一個值(可以很複雜,如多級 PHP 數組),它存儲數據。 稍後,甚至可能根據不同的請求,您可以使用數據的名稱來檢索該數據。 不同之處在於選項表中的數據將永遠存在。 也就是你可以存數據,三年後,它還在。
每個瞬態都由三部分組成:
- $瞬態。 這是用於識別瞬變並調用它的字符串。 它也被稱為瞬態的“鍵”或“名稱”。
- $值。 這是通過 API 檢索的信息。 transient 的值可以是對象、數組、數字或字符串。
- $過期。 這是瞬態在您的數據庫中保留的時間,在它被刪除並且您必須再次通過 API 訪問您需要的信息之前。
從表面上看,這就是 WordPress 瞬變的全部內容。 但是,為了正確使用它們,您需要了解更多信息。
然而,瞬態數據不會留下來。 這才是重點! 您可以請求數據,並通過以下兩種方式之一發現它丟失了。 首先,當您存儲數據時,您指定一個到期日期。 例如,您可以說“將其存放三個小時”。 因此,如果您在四個小時後請求它,它就會丟失。
第二種方式是允許數據在任何時間、任何原因簡單地消失。 我知道這聽起來很奇怪! 如果不能指望數據,存儲數據有什麼意義? 關鍵是存儲是 WordPress 將嘗試滿足的請求,但由於這種靈活性,可以使用不同類型的臨時存儲實現,這意味著可以使用不同的高級技術使臨時存儲非常高效, 即使在多服務器集群環境中也能正常運行。
因為這個“隨時消失”的東西,你通常使用瞬態緩存。 也就是說,如果你需要計算一些需要實時的東西,比如緩慢的 MySQL 查詢,或者從外部源檢索數據,比如某人的 Twitter 或 RSS 提要,你可以將計算的數據存儲在瞬態中,知道如果它丟失總是可以重新創建它。 但在通常情況下——當它沒有丟失時——你可以快速獲得數據而無需重新計算。
在您的 WordPress 網站上使用瞬變的好處
正如我們之前提到的,瞬態的主要好處是它們可以提高網站性能。 這里以 Google Site Kit 插件為例,簡要介紹了它的工作原理。
激活插件後,它會使用 API 在 WordPress 儀表板中顯示來自 Analytics 和 Search Console 等平台的數據。 如果沒有瞬變,每次您查看 Site Kit 儀表板時,WordPress 都必須從每個工具中檢索此信息:
相反,Site Kit 包括緩存來自 Analytics 和 Search Console 的數據的瞬態。 它們存儲一天(如果平台沒有返回數據,則存儲一小時)。
以後每次訪問 Site Kit 儀表板時,WordPress 都可以從數據庫中快速檢索存儲的信息,而不必再次調用 API。 當有效期結束時,舊數據將被刪除。
這意味著您不必每次都等待結果加載。 這在各種情況下都很方便,例如顯示您的帖子的社交媒體共享計數或顯示新聞源。
在您的 WordPress 網站上使用瞬變的缺點
當您的插件/主題在不同的瞬態實現下運行時,讓您遇到瞬態問題的是不同且難以重現的行為。 不同的瞬態實現意味著您只會在某些類型的站點的某些配置中遇到問題,而不會在其他站點中遇到問題。 作為開發人員,如果您沒有意識到這個陷阱並且沒有相應地編碼,您會認為您的代碼是正確的,但實際上它會在現場崩潰,您甚至不知道如何重現它!
何時使用 WordPress 瞬變
瞬變在到期後將從您的數據庫中刪除。 因此,您只想將它們用於不斷重新創建的信息。
此外,雖然它們可以提高項目的性能,但瞬變最好保留給大型查詢和遠程調用。 如果它需要更多的代碼來創建一個瞬態,而不是每次需要時簡單地對資源發出新的請求,那麼你最好不要這樣做。
管理 WordPress 瞬變
如果您想輕鬆查看和管理當前在您的 WordPress 網站上工作的瞬變,您可以安裝 Transients Manager 插件:
它提供了一個完整的瞬變列表,您可以通過導航到工具 > 瞬變找到它:
在這裡您可以看到我們之前列出的所有三個臨時元素——鍵(名稱)、值和有效期。 您可以通過單擊“編輯”鏈接來編輯這些功能中的任何一個:
您還可以單獨或批量刪除瞬變。
瞬態中使用的基本操作
在編寫自己的瞬態代碼時,您可能需要使用三種基本操作。 我們在下面概述了它們中的每一個,並繼續以 Site Kit 為例。
1.設置瞬態
創建或“設置”瞬態是定義鍵、值和有效期並將該信息應用於相關數據的過程。 為此,您將使用以下格式:
Set_transient ('key', $value, expiration_period)
以下是 Google Site Kit 中用於設置存儲分析數據的瞬態的代碼:
// Cache "data found" status for one day, "no data" status for one hour. set_transient( $transient_key, (int) $has_data, $has_data ? DAY_IN_SECONDS : HOUR_IN_SECONDS ); } return (bool) $has_data; } }
臨時鍵是googlesitekit_analytics_has_data (在代碼前面定義),值是$has_data或$has_data ? ,有效期為一天或一小時(取決於值)。
2. 檢索瞬態
檢索瞬變有點複雜。 首先,您需要使用一個函數來請求必要的數據。 然後您將檢查它是否具有應加載的相應瞬態,而不是發出新的 API 請求。
結果可能看起來像這樣:
function some_function(){ $transient = get_transient('key');
然後,您需要返回瞬態數據,或刪除過期數據並重新調用源。 最後,您必須在返回新數據後設置瞬態,以便在有效期結束之前再次存儲它。
在 Google Site Kit 中,它看起來像這樣:
/** * Checks whether Analytics data exists for the given URL. * * @since 1.4.0 * * @param string $url The url to check data for. * @return bool */ protected function has_data_for_url( $url ) { if ( ! $url ) { return false; } $transient_key = 'googlesitekit_analytics_has_data_' . md5( $url ); $has_data = get_transient( $transient_key ); if ( false === $has_data ) { /* @var Google_Service_AnalyticsReporting_Report[]|WP_Error $reports Array of reporting report instances. */ $reports = $this->get_data( 'report', array( 'url' => $url, 'metrics' => array( array( 'expression' => 'ga:users' ), array( 'expression' => 'ga:sessions' ), ), ) ); if ( is_wp_error( $reports ) ) { $reports = array(); // Bypass data check and cache. } foreach ( $reports as $report ) { /* @var Google_Service_AnalyticsReporting_Report $report Report instance. */ $report_data = $report->getData(); /* @var Google_Service_AnalyticsReporting_ReportData $report_data Report data instance. */ foreach ( $report_data->getTotals() as $date_range_values ) { /* @var Google_Service_AnalyticsReporting_DateRangeValues $date_range_values Values instance. */ if ( isset( $date_range_values[0], $date_range_values[1] ) && ( 0 < $date_range_values[0] || 0 < $date_range_values[1] ) ) { $has_data = true; break 2; } } }
這段代碼後面應該是我們在上一節中包含的用於設置瞬變的片段。
3.刪除瞬變
在某些情況下,您可能會發現您想要刪除瞬變。 例如,如果您希望始終在 Google Site Kit 中看到最新的分析,最好不要緩存數據(儘管我們不建議您實際刪除 Site Kit 的瞬態數據)。
否則,即使您有新訪客,該插件也會全天顯示相同的結果。 由於瞬態持續 24 小時,您下午查看的數據將只是您早上加載的數據的緩存版本。
刪除瞬變最簡單的方法是使用瞬變管理器插件。 但是,如果您想改用代碼,可以使用delete_transient()函數。 您只需要臨時密鑰:
delete_transient('key');
但是,您必須對要刪除的每個瞬態重複此操作。
瞬時過期:它是如何工作的?
可以用幾種不同的方式來表示瞬態到期期限。 最簡單的兩個選項是:
- 以秒為單位 ( set_transient('key', $value, 86400))
- 使用 WordPress 時間常量 ( set_transient('key', $value, DAY_IN_SECONDS))
或者,您也可以設置永不過期的瞬變。 這在您希望保持瞬態數據相同的情況下非常有用,直到您手動刪除和重置緩存信息。
創建永不過期的瞬變非常簡單。 只需將set_transient函數中的過期參數留空,或將其標識為零即可。
了解 WordPress 瞬態 API
WordPress Transients API 只是將信息緩存在站點數據庫中的一種方式。 它支持我們在本文中討論的所有相關操作,包括設置、獲取和刪除瞬變。
換句話說,Transients API 只是 WordPress 核心的一部分,可讓您使用瞬變。
Transients API 後端的兩種最常見的實現:
- 內置於 WordPress 中的一個,因此是迄今為止最常見的。 瞬態值像常規選項一樣存儲在 wp_options 表中。 對於瞬態,會存儲一個附加選項來保存到期日期。 訪問瞬態時,WordPress 首先提取到期日期。 如果它已過期,WordPress 會從表中刪除這兩個選項,從而“清理”數據,並假裝數據從未存在過。 如果它沒有過期,它會從選項表中獲取內容。
- 內存緩存。 Memcached 是一種非常簡單但高效且可靠的服務器端軟件,旨在完全執行 Transients API 應該做的事情——基於密鑰存儲數據,該密鑰在給定時間過期,並且可以在需要時隨時消失到。
使用 memcached 而不是 WordPress Transients 有兩個特殊的好處,這就是我們在 WP Engine 上自動為您預配置它的原因。 我們支持你
我。 Memcached 在存儲和檢索值方面比 WordPress Transients 快 10 到 100 倍,這特別有趣,因為 transients 的目的是緩存數據以提高站點的速度。
二. Memcached 設置了數據佔用的最大空間量(例如 64MB RAM),這意味著如果站點一次存儲過多數據,它會自動丟棄舊數據,因此永遠不會用完空間。 但是內置的 WordPress Transients 將在選項表中存儲任意數量的數據。
在您的開發中應用瞬變
假設您重複讀寫同一個 Transients 密鑰,並假設它有 1k 數據。 在這種情況下,Memcached 和 WordPress Transients 都將按照您的預期進行操作,並且兩者都將佔用大約 1k 的空間(在選項表中或在 memcached 中)。
現在假設您正在讀取和寫入不同的 Transients 鍵,每個瀏覽器會話都不同。 簡而言之,如果您將用戶會話數據存儲在 Transients 中怎麼辦? 這在表面上是有道理的。 會話數據不應該永遠存在,您也不想為特殊的數據庫表而煩惱。 除此之外,許多 WordPress 託管公司不允許 PHP 會話,因此這確實是次佳選擇。 它甚至是快速和多服務器的。
這就是差異出現的地方。 對於 Memcached 和流量較低的站點,此方法似乎有效。 這些值會持續一段時間,然後在過期時被刪除。 但是,如果服務器負載很重,服務器需要存儲的會話數據量將超過 memcached 中的可用空間,因此您會比您想像的更快開始丟失會話數據。 如果您沒有在這種精確的、高負載的環境中進行測試,您將永遠不會知道這一點。 一般來說,這些環境最終會如此快速地填充 memcached,以至於實際上 memcached 被禁用,因為它永遠無法保留足夠長的數據以供使用。 您實際上根本沒有 Transient API 緩存!
但是使用 WordPress Transients,你會得到不同但仍然非常不受歡迎的行為。 因為這些值被寫入數據庫,而不是固定大小的 RAM 塊,所以它們都會保留下來。 這意味著即使站點負載很重,您仍然擁有會話數據。 驚人的!
或者你是這麼想的。 因為 Transient API 中沒有說明的是當您使用會話等唯一鍵時會發生什麼。 內置方法會導致選項表無限期地填滿! 因為:WordPress 的“舊數據清理”僅在您請求密鑰時運行(如我們之前所述)。 如果你只是留下鑰匙,它會永遠留在選項表中。 沒有單獨的過程可以清理這些!
我們不僅意識到了這個問題,還想幫助可能正在運行不理解這個問題的代碼的客戶。 這就是託管 WordPress 中的“託管”所在! 每天晚上,我們都有一個自動化流程來查看您的選項表以查找過期的瞬變,並刪除它們(包括數據和過期日期項)。 繁榮! 他們走了,你不必擔心他們。
所以我們這樣做真是太棒了,但是作為應該在任何託管環境中正常運行的通用插件或主題的開發人員,您不能在您的插件或主題可能部署的所有潛在環境中執行此操作,並且您希望確保為用戶和客戶提供盡可能最優化的代碼。
然而,既然您已經知道瞬態是如何出錯的,那麼看看並了解如何使您的代碼更高效可能是一個很棒的主意。 如果您已經讀到這裡,您很可能喜歡優化您的代碼,而這篇博文可能會為您挑戰並激勵您重寫一些東西以提高可擴展性!
使用您的 WordPress 網站做更多事情
作為 WordPress 開發人員,為您的最終用戶提供遠程數據訪問權限,同時保持快速性能是關鍵。 WordPress 瞬變可以幫助您實現這一目標。
但是,從閃電般快速的 WordPress 託管和專業開發人員資源中獲得一點額外幫助也沒什麼壞處。 無論您是編碼新手還是經驗豐富的專業人士,我們都隨時準備提供幫助。 看看我們今天的計劃!