在構建 Web 應用程序時,我們必須時刻注意的最重要的事情之一就是性能。
正如他們所說,性能是一項功能。
無論您是設計師、開發人員還是用戶,您都會直觀地知道這一點:在應用程序方面,我們討厭等待。當事情執行得不夠快,或者我們必須等待比我們認為應該等待的時間更長的時間時,我們會感到沮喪。
為此,大多數現代 Web 開發框架都可以通過使用某些 API 來實現某種類型的緩存,而 WordPress(盡管是一個基礎)也不例外。
因此,當我們繼續討論為什么 WordPress 是作為 Web 應用程序開發基礎的可行選擇時,我們將了解核心應用程序提供的 API、它們的工作原理以及我們如何利用它們來發揮我們的優勢,以及如何通過額外的緩存插件進一步提高性能。
為什么緩存很重要?
簡而言之,緩存很重要,因為它允許我們將經常檢索的數據存儲在內存中的某個位置,以便可以快速檢索。
當您從更大的范圍來看時,當多個用戶查看一個網站時,這一點變得越來越明顯。我的意思是,如果一個人(或極少數人)訪問一個網站,并且該網站將其數據存儲在數據庫中,那么每次加載頁面時,都必須從該網站檢索該信息。數據庫,插入到頁面中,然后返回給用戶。
如果建立了一定級別的緩存,則不必頻繁地調用數據庫。相反,可以從內存中的某個區域提取信息,從而加快檢索速度,從而加快頁面加載時間。
我們將在本文后面詳細介紹這方面的技術細節。
插件怎么樣?
如果您已經使用 WordPress 很長時間,那么您可能熟悉許多可用的緩存插件。
這些無疑是加速網站和/或 Web 應用程序速度的絕佳解決方案,但它確實提出了一個問題:如果可以使用插件來執行此操作,那么我們為什么要擔心它?
當然,這是一個有效的問題,但插件只能自己完成這么多工作。
開發人員可以以這樣的方式構建他們的應用程序,使它們不僅在沒有緩存機制的情況下表現良好,而且還可以通過所述緩存插件得到極大的增強。
我的意思是,這些緩存插件會查找主題和應用程序要存儲在某個位置的數據,如果我們可以在自己的工作上下文中以編程方式執行此操作,那么這些插件將產生更大的效果性能。
在了解了可用的 API 后,我們將在本文后面重新討論此主題,看看它們如何提高緩存插件的性能。
瞬態 API
為了在應用程序中引入第一級緩存,我們需要利用 WordPress 的 Transients API。首先,請注意瞬態的官方定義是“僅存在很短時間的事物。”
正如食品法典中的定義:
[Transient API] 提供了一種簡單且標準化的方法,通過為其指定自定義名稱和時間范圍(在該時間范圍之后數據將過期并被刪除),將緩存數據臨時存儲在數據庫中。
但這到底是什么意思呢?畢竟,數據仍然存儲在數據庫中,那么為什么這比將數據存儲在任何其他數據庫表(例如 wp_options 表?)中更好呢?
一旦我們重新審視有關緩存和插件的討論,我們將更詳細地討論這個問題。
設置瞬態
設置瞬態值實際上非常簡單,就像在選項表中存儲數據一樣。
具體來說,您需要一個唯一標識數據的鍵值,然后需要一個與該鍵關聯的值。您還需要一個過期時間(以秒為單位)來在刷新表之前將數據保留在表中。
假設我們希望將當前用戶的名稱存儲為網站上最后一個或最近活躍的用戶。我們可以利用 wp_get_current_user() 函數來做到這一點。
首先,我們將設置如下值:
set_transient( ‘most_recent_user’, wp_get_current_user()->user_login, 12 * HOUR_IN_SECONDS )
在這里,請注意以下幾點:
- 我將系統中最近的用戶識別為當前登錄的用戶,并且我們會將其存儲 12 小時。
- 請注意,HOUR_IN_SECONDS 常量是 WordPress 3.5 中引入的。此處提供了完整的常量列表。
盡管這就是我們設置瞬態的方式,但這仍然無法解釋我們如何管理瞬態(如果瞬態不存在或已存在)。
我們將在本文后面詳細介紹這一點。
檢索瞬態
當涉及到檢索瞬態時,它與檢索元數據或選項等內容非常相似。我的意思是,我們只需要知道檢索信息的密鑰即可。
因此,為了與上面的示例保持一致,我們可以通過以下調用檢索應用程序的最新用戶:
get_transient(‘most_recent_user’);
這顯然會返回您存儲的任何類型的信息,或者如果瞬態已過期(即已經過去超過 12 小時),則該函數將返回 FALSE 的布爾值.
這是要記住的關鍵,特別是當您嘗試讀取緩存值,然后需要從另一個數據源獲取它們(如果它們在臨時存儲中不可用)時。
我們將在本文結束之前看一下執行此操作的完整示例。
刪除瞬態
最后,如果您需要刪除瞬態以將其完全刪除,或者在其定義的到期之前將其刪除以便將其替換為另一個值,那么您只需使用以下函數:
delete_transient(‘most_recent_user’);
此外,如果臨時值刪除不成功,該函數將返回 FALSE;否則,它將返回 FALSE。
即將到期的瞬態
在設置緩存值的過期時間時,有多種方法可以使設置值比音樂基本整數操作更容易。
例如,MINUTE_IN_SECONDS 比 60 更容易使用,尤其是在乘以分鐘、小時或天時。
從 WordPress 3.5 開始,核心應用程序中添加了幾個常量,使這些計算更易于閱讀。
即:
- MINUTE_IN_SECONDS
- HOUR_IN_SECONDS
- DAY_IN_SECONDS
- WEEK_IN_SECONDS
- YEAR_IN_SECONDS
更容易使用、閱讀和編寫,不是嗎?
使用瞬態的完整示例
此時,我認為重要的是要了解如何從在選項表中存儲值開始設置瞬態。
以下是我們執行此操作的順序:
- 我們將在 wp_options 表中保存一個選項。
- 接下來,我們將檢查緩存中是否存在該值。
- 如果該值確實存在于緩存中,我們將刪除它;否則,我們將添加它。
然后,在代碼的后半部分,我們將執行以下操作:
- 我們將嘗試從緩存中檢索值函數。
- 如果該值存在于緩存中,我們將回退到選項表;但是,如果該值確實存在,那么我們將使用它。
話雖如此,讓我們看一下:
$username = wp_get_current_user()->user_name; add_option( 'most_recent_user', $username ); // Check to see if the value exists in the cache if ( FALSE !== get_transient( 'most_recent_user' ) ) { // If it does, we'll delete it... if( delete_transient( 'most_recent_user' ) ) { // ...and store the most recent user for a maximum of one minute set_transient( 'most_recent_user', MINUTE_IN_SECONDS ); } else { // The deletion was unsuccessful, so log the error } } // Now try to read the value from the cache. if ( FALSE !== ( $username = get_transient( 'most_recent_user' ) ) { // Since it doesn't exist, then we'll read it from the option's table $username = get_option( 'most_recent_user' ); // And then we'll update the cache set_transient( 'most_recent_user', $username, MINUTE_IN_SECONDS ); }
請注意,這個示例并不完整 – 它可以重構得更清晰一些,并且代碼應該抽象為與應用程序更相關的函數,但此代碼的目的是展示如何處理條件邏輯、選項和瞬態。
這如何與插件配合?
現在,綜上所述,我們可以重新審視如何使用瞬態來提高插件性能的問題。
正如我們之前提到的:
在了解了可用的 API 后,我們將在本文后面重新討論此主題,以了解它們如何增強緩存插件的性能。
塊引用>
話雖如此,緩存和 WordPress 數據庫與數據庫中數據的位置有關。
由于瞬態數據存儲在與其他數據不同的位置,因此插件(例如基于 memcached 的插件)將查找存儲瞬態數據的數據,然后將數據從該位置加載到內存中。
因此,當請求數據時,將從內存中檢索數據。如果數據不存在,則會從數據庫中檢索。
最重要的是,如果編程正確,當從緩存中讀取數據失敗并從數據庫中檢索數據時,會將其插回緩存中,以便下次檢索時將其插入到緩存中。內存中可用。
最后,關于瞬態信息需要注意的關鍵一點是它有一個有效期。這意味著數據只會在數據庫的該區域中存儲特定的時間。
為此,我們需要考慮到這一點。這意味著每當我們想要檢索瞬態時,我們都需要確保它們存在。如果沒有,我們會將它們從所在位置拉出,然后將它們存儲在正確的位置。
自定義查詢
至此,我們已經介紹了 WordPress 提供的許多與 Web 應用程序開發基礎相關的功能。
但是我們還有最后一個主要組件要介紹,那就是如何處理自定義查詢。
當然,有一些很棒的 AP??I,因為它與運行專為 WordPress 特定目的而設計的查詢相關,例如 WP_Query 和 WP_User_Query,但我們還將了解一些允許我們編寫的本機工具使用定義的 WordPress 對象以及允許正確數據清理的方法對數據庫進行自定義查詢。
但我們將在下一篇文章中介紹所有這些內容以及更多內容。