Magento2 – 給開發者:避開影響效能的程式設計 – 關於Full-Page Cache
有關Magento效能的議題,官方網站已提供了許多由後台設定的優化方式。過去我們也分享了不少實務上有關環境設定的調校方式。今天要跟大家提醒的,是作為開發者,在進行客製時所需注意的細節之一 – Full Page Cache。
我們知道Magento本身功能是複雜靈活的,這代表其邏輯演算過程,會耗費一定的時間與資源。然而過久的網頁開啟時間,是使用者體驗的致命傷。為了加速網頁速度,『快取』(cache) 機制被應用在優化網站效能。打開Magento後台 System > Cache Management,這裡列出了Magento各類快取,其中的Page Cache,就是今天的重點。
Magento的Page Cache,具體來講就是把網頁整個內容儲存起來,下次要讀取時,直接抓取先前所儲存的內容,不必再走一次邏輯運算來產生內容。既然快取是把內容暫存起來,當內容有異動時,這個暫存內容就必須被更新。所以後台的 Cache Management 支援管理者可以手動清除快取內容,在必要時由人工去刷新網頁。像是後台編輯過 Contents > Elements > Pages ,就需要手動刷新 Page Cache。
現在問題來了!有些資料的呈現,是動態非固定的。例如會員登入後的右上角資訊,顯示登入者姓名。想像一下這樣的內容若被快取在整個網頁上,其他使用者就看到被快取住的那個姓名,這樣肯定有問題。但我們又確實需要快取整頁的速度效益,那要怎麼辦呢?於是這裡Magento使用ajax方式來解決:那些需要動態呈現的內容,在快取頁面被打開後,才由javascript透過API抓取,逐步更新在頁面。這也是為什麼當一個頁面很快的被開啟,而畫面部份內容要稍後才顯示的原因。
那這跟開發有什麼關係呢?假設我們今天要為某個頁面增加客製資訊,最直覺的方式,就是在layout中增加一個block,然後在block的template中,去顯示由block提供的資料。當block提供的是動態資料,你會發現需要清除快取的才能更新這個客製的內容。而網路搜尋解決方式,可以找到一個簡單的方案,就是在layout中把那個block的屬性cacheable設為false。
做這樣的設定,網頁內容能如預期的顯示動態資料。
重點來囉!從字面上解讀,我們是不快取那個block的內容,但是在Magento的快取機制中,實際上的行為是取消整頁快取(Page Cache)。意思是凡納含這塊客製block的頁面,就不會被快取住。換句話說,他Page Cache˙的效益被取消了,所以頁面內容每次都是即時產生。當你發現某個頁面的開啟總是慢,試著確認是否存在cacheable=false的block,如果他是主因,改寫這塊資料的載入方式,拿掉cacheable=false,可以重得整頁快取的速度。
既然cacheable=false會取消Page Cache作用,是否我們就完全不可以使用它呢?其實這取決於設計上的情境。假如今天要客製一個所有頁面都吃到的通用block,使用cacheable=false等同關掉整個網站的Page Cache,就應該改用ajax的方式保留Page Cache。而如果客製的block頁面存取不那麼頻繁,效能需求不高,可以考慮使用cacheable=false來顯示動態資料。畢竟ajax的做工遠比block直接吐資料來得複雜多:除了後端要多做API給前端呼叫,前端還要有額外的javascript依照特定邏輯載入資料,這些都是評估方案的考量因素。
那麼今天跟大家的分享就到此告一段落,希望幫助大家在不影響網站的效能下進行客製,那麼我們下次再見囉!
如果有您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤歐斯瑞臉書粉絲團、Instagram,以及訂閱我們的電子報,就不錯過最新文章喔!
想學習更多Magento設定嗎?請見:Magento教學導覽
我要留言