很多人剛開始寫 Magento 時,一定遇過這個狀況:
.phtml
,結果頁面沒變。Page Cache 是 Magento 效能的靈魂,但同時也是開發者最常踩的坑。今天我們就把它完整拆開來講,從「設計理念」到「實作細節」,再到「開發最佳實務」。
Magento 是一個「重型」電商系統。每次有人開一個商品頁,系統要做的事情非常多:
👉 如果每次都重跑這一整套,伺服器會累爆。
所以 Magento 設計了 Full Page Cache (FPC):
Magento 有兩種 FPC backend:
File cache(預設)
var/page_cache/
裡。Varnish(官方推薦)
👉 所以「Page Cache」是概念,本體可以是 檔案 或 Varnish。
來看一個完整的請求流程:
使用者第一次進入頁面
第二次有人進來
👉 流程圖(簡化):
Request → 檢查 cache
├─ 有 → 回快取
└─ 沒有 → Magento 組頁面 → 存 cache → 回應
很多人會搞混:
Page Cache (full_page)
Block Cache (block_html)
👉 簡單說:Page Cache 是大鍋飯,Block Cache 是小菜。
因為整個 HTML 被 cache 住,舊畫面直接回給你。
例如購物車數量、登入使用者名稱 → 這些如果沒特別處理,就會被一起 cache 起來,導致顯示錯誤。
有時候你明明改了程式,但因為快取還在,看不到效果,以為程式沒跑。
Magento 有一個設計叫 Hole Punching(也叫 ESI block, Edge Side Includes):
👉 在 layout XML 裡,你可以這樣設定:
<block class="..." cacheable="false"/>
這樣這個 block 就不會被整頁 cache 住。
bin/magento cache:clean full_page
👉 清掉快取,讓下一次請求重新生成 HTML。
bin/magento cache:disable full_page
👉 避免開發時被快取干擾。
因為沒有 Page Cache,網站會慢到爆。建議搭配 Varnish。
Magento 的 cache 很聰明,每個頁面都會有「cache tag」。
例如:
CATALOG_PRODUCT_123
CATALOG_CATEGORY_45
當商品更新時,Magento 只會清除相關 tag 的快取,而不是把所有頁面全清掉。
👉 這樣能確保效能,同時又保證內容正確。
full_page
,避免誤判。full_page
;改程式邏輯 → 可能要清多種 cache。cacheable="false"
或用 Ajax。X-Magento-Cache-Debug
,可以知道快取有沒有命中。Page Cache 可以一句話總結:
它是 Magento 提升效能的超強武器,但也是開發時最大的坑。
搞懂 Page Cache,你就能少掉一半以上「為什麼畫面沒更新」的困擾~~