Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

WordPress 的內建快取機制 transient

這陣子為了公司網站的更新,稍微接觸了一下 WordPress 的快取機制。

原本想要達成的目的是:「網站使用者只會在該工作階段 (session) 中第一次載入時,才會顯示預載動畫 (preload animation)。」

然而,正當準備透過 session_start() 的方式來解決這個問題時,碰巧讀到了社群夥伴王大的〈為什麼你不該在 WordPress 中使用 PHP 工作階段〉,裡面提到 session_start() 會造成潛在的安全性問題,而且 WordPress 原本的設計上,並不使用 $_SESSION 來記錄使用者狀態。

解決方案 transient

既然不應該用 session 來作為解決方案,那麼就必須要尋求替代方案了。從王大附註的參考資料中,提到了 transient 這個關鍵字,於是便循線找到社群夥伴阿竣的文章。

所謂的 WordPress Transients API,是將工作階段的資料暫存在資料庫中,用來快取查詢的一個機制。其基本語法如下:

<?php
get_transient( 'transient_名稱' );
set_transient( 'transient_名稱', $SQL查詢結果, 失效時間 ); 

於是異想天開的寫下了類似的程式碼:

<?php
if ( false === get_transient( 'preload_is_played' ) ) {
  // 這裡開始執行動畫
  set_transient( 'preload_is_played', true, 120 );
  // 因為在測試環境,所以先定義 120 秒的失效時間
}

測試的當下好像煞有其事,但其實中間有一個邏輯問題,導致我們並不能透過 transient 的快取機制來處理「判斷是否啟用預載動畫」。

如果我們透過 transient 來當作解法,這樣會導致以下的邏輯錯誤:

使用者 A 進入網站後,系統定義了一個 transient,此時使用者 B 進入網站時,因為 transient 仍然存在於資料庫中,因此預載動畫便失效了。

結語

透過 transient 的機制,來快取資料庫查詢,對於頁面中可能同時存在數個查詢的情況,或是需要串接外部 API 時 (譬如 Google Map API) 應該會有幫助。但是用在偵測個別使用者的行為時,便沒有辦法達到想要的結果。

如果要根據使用者來判斷播放預載動畫的行為,應該還是要用 Cookies 的機制來處理。明天再來繼續研究 Cookies。

參考資料

預設圖片
Eric Chuang

正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料