Magento FPC清除事件
每個建置網站的人一定都曾思考過這個問題:「如何讓我的網站變得更快?」網站的載入速度除了影響使用者體驗,也和SEO大有關係。因此,許多工程師使盡渾身解數,只求省下那數十毫秒的載入時間。使用Magento建置的網站,其功能強大且完善,但隨著啟用的套件越多,網站的載入速度也會變得越慢。所幸Magento本身已有「全頁快取 (Full Page Cache)」的功能,可大大優化這方面的表現。關於如何善用FPC, 在這篇文章中也有介紹。
然而,只要該網頁啟用了FPC就一定沒問題嗎?
由於FPC會把整個頁面「儲存」起來,若是網頁中所顯示的資料有所變化,系統必須將相關網頁的快取清除,以免使用者看到過時的資料。例如,管理者在後台將某個商品下架,該商品的商品頁、和該商品相關的商品分類頁、同分類之下的其他商品頁等等…的全頁快取皆會自動被系統清除。
檢視FPC的程式碼,便能發現系統會監聽一些事件,觸發時會根據情況清除相關的全頁快取。這些事件如下:
- core_layout_render_element
- clean_cache_by_tags
- clean_cache_after_reindex
- adminhtml_cache_flush_system
- adminhtml_cache_flush_all
- assigned_theme_changed
- controller_action_postdispatch_catalog_product_save
- model_save_commit_after
- maintenance_mode_changed
以上事件可於 vendor/magento/module-page-cache/etc/events.xml 或 app/code/Magento/PageCache/etc/events.xml 檔案中找到。
其中多數都是與管理員在後台執行的都做有關,例如在後台手動清除快取,或是將網站的維護模式進行切換。比較值得注意的事件是 model_save_commit_after, 當物件狀態轉換並被寫入資料庫時,便會觸發此事件,而導致相關的快取被清除。
其中一個常見的情況如:商品庫存在與遠端伺服器同步資料時,邏輯判斷有誤而導致商品庫存狀態頻繁地進行不必要的更動。正常情況下,這些事件並不會(也不應該)頻繁地被觸發。若發現網站頁面的全頁快取並未如常發揮,可針對這些事件檢查是否有異常觸發的現象。惟須注意的是,事件被觸發時,系統仍會根據情況判斷是否須清除快取,因此事件被觸發並不代表快取一定已經被清除。
當系統判斷應清除快取時,皆會透過 \Magento\PageCache\Model\Cache\Type::clean() 執行清除快取的動作。此函式接受2個參數:
- $mode: 清除模式,接受的選項如下
- \Zend_Cache::CLEANING_MODE_ALL (預設)
- \Zend_Cache::CLEANING_MODE_OLD
- \Zend_Cache::CLEANING_MODE_MATCHING_TAG
- \Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG
- \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG
- $tags: 相關的快取tag陣列,預設為空陣列
可針對這個函式使用plugin搭配logger紀錄觸發時間、事件、參數等等,以利排除全頁快取異常的肇因。關於plugin的使用方式,可參考此系列文章,本篇不再贅述。
希望本篇文章可幫助諸君進一步了解Magento Full Page Cache的運作行為,將此功能發揮得淋漓盡致以便提昇網站的載入效率、改善使用者體驗。喜歡歐斯瑞文章的讀者們,記得追蹤歐斯瑞FB粉絲團及IG,也別忘了訂閱電子報,隨時掌握第一手消息喔!有問題也歡迎聯繫我們~
我要留言