問題描述
我正在閲讀一些 best practices from 10up,他們提到在 WP_Query 中將這兩個標誌設置為 false(取決於您正在查詢的內容):
-
'update_post_meta_cache' => false:當後期元數據不被使用時很有用。 -
'update_post_term_cache' => false:當分類術語不被使用時很有用。
我假設它使用像 update_post_caches()這樣的東西,但我甚至不敢肯定這是什麼意思。有人可以解釋這兩個標誌在 WP_Query 中的含義,它們是多麼有用嗎?更多的信息越好,因為我不太瞭解 WordPress 如何緩存的東西,但是對於這兩個標誌的一個深思熟慮的答案也是可以接受的。
最佳解決方案
對象緩存無處不在
WordPress 儘可能地減少數據庫查詢的數量。
例如,任何時候您獲得元字段或分類字段,在查詢數據庫之前,WordPress 會查看是否已經查詢並存儲在緩存中,並從中返回,而不是查詢數據庫。
“cache job” 是通過 WP_Object_Cache 類和 wp_cache_*函數完成的 (這是包裝類的方法。)
緩存生活的地方
默認情況下,”cache” 只不過是一個 PHP 全局變量。這意味着它在內存中,也意味着它會在每個請求上消失。
但是,通過 dropins(advanced-cache.php 和/或 object-cache.php),可以設置一個自定義的方式來處理這個緩存。
通常,這個下拉菜單用於設置”survive” 單個請求的某種緩存機制。
由於這個原因,在 WP 的人中,這些都被稱為”persistent cache” 插件 (即使在泡沫之外,”cache” 和”persistent” 也不會一起做出很大的意義) 。
因此,使用”persistent cache” 插件可以大大減少數據庫查詢的數量,因為緩存在每個請求上都不會更新。
一些例子
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
上述 2 行代碼將最多觸發 1 個數據庫查詢。
實際上,當您查詢自定義字段時,該數據庫的所有字段都將從數據庫中檢索,通過對象緩存進行緩存,後續請求從緩存中提取數據,而不是從數據庫中提取數據。
分類術語也是一樣,WordPress 會將分類的所有術語拉一次,然後從緩存中返回。
對象緩存在 WordPress 中被廣泛使用。不僅用於帖子,元值和分類,還可以為用户,評論,主題數據…
什麼 WP_Query 與所有這一切有關係?
當您通過 WP_Query 查詢某些帖子時,默認情況下,WordPress 不僅可以從數據庫 (或從緩存中緩存) 中提取它們,還可以更新所有自定義字段的緩存以及與拉出的帖子相關的所有分類。
所以當你打電話時,例如 get_the_terms()或 get_post_meta(),而循環的帖子通過 WP_Query 得到,你實際上並不觸發任何數據庫查詢,而是從緩存中提取信息。
好,不是嗎
是的,但它帶有成本。
緩存更新”magic”,WordPress 通過 WP_Query 拉動帖子發生在 update_meta_cache for meta 和 update_object_term_cache 用於分類。
如果您查看這些函數的源代碼,您將看到 WordPress 在每個函數中只執行一個 db 查詢,但也進行了大量的處理。例如,在 update_object_term_cache 中有 7 個嵌套的 foreach … 如果你有很多分類,每頁的帖子數量很多,這不是很好。
關於 WP_Query 參數,最後
'update_post_meta_cache'和'update_post_term_cache'在設置為 false 時會做的是分別防止 WordPress 更新緩存的自定義字段和分類。
在這種情況下,第一次查詢自定義字段或分類法時,將觸發數據庫查詢,並緩存數據。
值得嗎?
像往常一樣,答案是否決定。大多數時間將這些值設置為 false 是一個不錯的選擇,因為它不需要時會阻止不必要的處理和數據庫查詢,並且無論如何,首次需要自定義字段/分類術語,緩存都會更新。
但是,如果您打算在 C 循環中調用 get_post_meta(),並且您將為帖子支持的所有 (或大多數) 分類而調用 get_the_terms(),那麼緩存更新將被觸發,並且可能沒有實際的有利於將這些查詢參數設置為 false 。
次佳解決方案
主要的興趣點是 update_post_caches 功能。 WP_Query 從 DB 獲取了所有的帖子後被調用。通常,您首先要發帖的原因是顯示它們,通常意味着根據元數據顯示術語和某些內容,因此,WP_Query 還將默認查詢與返回的帖子相關的元數據和術語數據的 DB 並存儲緩存*。這些信息在 WP_Query 返回的數據中不是明確提供的,但是當您調用相關 API 以獲取特定帖子的術語和元信息時,它將已經在內存中可用,並且不需要發送新的查詢到 DB 。
這使 Wordpress 能夠通過僅發送一個請求來獲取所有帖子的信息而不是向每個帖子發送請求來減少與向 DB 發送請求相關的開銷。
現在我找不到什麼時候不希望緩存更新的任何非常簡單的例子,但是如果你只想要所有帖子的標題列表,可能是一個瑣碎的例子。因此,您不需要術語或元數據。
* cache – 這裏最重要的是基於內存的緩存,即使沒有任何對象緩存插件的活動,WP 也可以存儲其中的所有數據。顯然,當您有對象緩存時,信息也將存儲在那裏。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。