這兩項優化使用者平常看不到,但它們解決的是 WordPress 兩個相當經典的結構性問題。
30 秒總覽
| 項目 | 內容 |
|---|---|
| 物件快取在做什麼 | 把重複的資料庫查詢結果記起來 |
| 誰最有感 | 後台操作與商店網站 |
| 跟整頁快取的差別 | 整頁快取救不了不能快取的頁面,物件快取可以 |
| wp-cron 的問題 | 預設靠訪客觸發,沒人來就不執行 |
| 要自己設定嗎 | 不用 |
問題一:wp-cron 靠訪客請求觸發
WordPress 內建的排程系統 wp-cron 預設不是真的 cron。它是掛在頁面請求上的——有人瀏覽你的網站時,WordPress 才順便檢查有沒有到期的排程工作。
這帶來兩個問題:
- 沒流量的站台,排程不會跑。你設定的定時發文、備份外掛、資料同步,在半夜沒訪客的時候通通停擺。
- 有流量的站台,訪客要幫你等。觸發排程的那個倒楣訪客,他的頁面載入時間得算上排程工作的執行時間。
RoamerHost 的做法是停用頁面請求觸發,改由平台排程每 5 分鐘、以 10 站並行的方式主動觸發所有運行中站台的 wp-cron。結果是排程準時執行,而且執行成本不會轉嫁到訪客的載入時間上。
問題二:物件快取
WordPress 每次產生頁面都要對資料庫做大量查詢——選項、文章 meta、分類法、使用者資料。沒有物件快取時,這些查詢每次請求都重跑一遍。
RoamerHost 為每個站台提供 Redis 物件快取,並且做了逐站 ACL 隔離:每個站台有自己的 Redis 使用者與密碼,只能存取自己的鍵。
為什麼 ACL 隔離重要?因為共用 Redis 最典型的災難是:某個站台執行了 FLUSHDB,把所有站台的快取一起清光。事實上這正是 WP-CLI 的 wp redis enable 指令會做的事——它會呼叫 flushdb。RoamerHost 在啟用快取時刻意避開這個指令、改用其他方式寫入設定,就是為了不讓單一站台有能力影響其他站台。
這些對你的實際意義
如果你從別家主機搬過來,可能會注意到:
- 後台操作變順(大量查詢被快取吃掉)
- 定時發文真的準時(不再等訪客)
- 你不需要另外裝物件快取外掛,也不需要自己架 Redis
需要注意的是:物件快取加速的是資料庫查詢,不是頁面快取。如果你要的是整頁靜態化,那是另一個層次的東西,可以搭配 LiteSpeed Cache 外掛使用——OpenLiteSpeed 對它有原生支援。
為什麼後台特別有感
前台可以靠整頁快取——頁面產生一次,之後大家看同一份現成的 HTML。
但後台不能快取。每次載入文章列表、開編輯器、看媒體庫,都是即時查詢資料庫。而 WordPress 後台的一次載入可能觸發數十甚至上百次查詢,其中很多是重複的。
物件快取把重複的部分記起來,所以它的效果在後台最明顯。這也是為什麼「前台正常但後台很慢」是物件快取最典型的適用情境。
wp-cron 為什麼要改
WordPress 的排程任務預設是「有訪客來訪時順便檢查該不該執行」。這個設計有兩個問題:
- 沒有訪客就不執行。半夜的定時發文、備份排程可能整晚都沒跑。
- 有訪客就一直檢查。流量大的時候,每次請求都多做一件事。
改成由系統層級的排程觸發,兩個問題一起解決——時間到就執行,跟有沒有訪客無關,也不佔用訪客的請求。
如果你曾經遇過「定時發文沒有準時發出」,原因九成是這個。
什麼情況下感覺不出差別
誠實講,有幾種網站裝了物件快取也沒什麼感覺:
- 純靜態內容、文章數量少——本來就沒有多少查詢可以省
- 整頁快取已經擋掉九成請求——訪客根本沒有觸發到資料庫
- 你只在前台瀏覽,很少進後台——最有感的部分你用不到
會明顯有感的是另一種:外掛多、商品多、後台操作頻繁、或有不能快取的動態頁面。商店網站幾乎必然屬於這一類。
常見問題
Q:我需要自己裝外掛嗎?
不用,環境已經配好。這篇是解釋它在做什麼、以及為什麼你會有感。
Q:物件快取跟整頁快取有什麼不同?
整頁快取存的是「整個頁面的成品」,物件快取存的是「產生頁面過程中的中間結果」。前者對不能快取的頁面完全無效,後者仍然有幫助。商店的結帳頁就是典型例子。
Q:資料改了會不會顯示舊的?
不會。資料變動時對應的快取會失效,下次查詢會重新取得。
Q:為什麼我的定時發文還是沒準時?
先確認發布時間的時區設定,再看該篇的排程狀態。改用系統排程之後這類問題大幅減少,但錯誤的時區設定不是排程能修的。
Q:這會讓網站快多少?
沒有一個通用數字。影響最大的變數是你的網站有多少重複查詢——外掛多、商品多、查詢複雜的網站受益最大;一個十篇文章的部落格感覺不太出來。
託管環境幫你省掉的部分
自架的話,這一整套要自己來:裝 Redis、設定連線、裝對應的外掛、確認它真的生效、處理版本升級、監控記憶體用量。
其中最容易被低估的是「確認它真的生效」——裝了外掛不等於快取有在運作,設定錯了畫面完全看不出來,網站照跑,只是沒有變快。你要去看命中率才知道。
託管環境把這些配好並持續維護,這也是成本拆解那篇說的隱藏成本的一部分:不是裝設的那一小時,是往後每次升級與排查的時間。
資料來源與延伸連結
物件快取的行為以 Redis 與 WordPress 官方文件為準:
- Redis 官方文件
- WordPress 開發者文件——快取與 API 相關
延伸閱讀
- WordPress 何時該升級方案:基本版與進階版的差別
- WooCommerce 商店的主機需求:為什麼一般 WordPress 主機會不夠
- 為什麼用 OpenLiteSpeed:WordPress 主機的引擎選擇
- WordPress 新手教學
想找人幫你做?
需求做到外掛做不到的程度時,就需要有人動到程式碼。浪花科技承接 WordPress 高階開發: