網站快取 & 伺服器內部快取:WordPress 快取的運作方式

聯盟行銷揭露 Ver 3.1
聯盟行銷揭露 Ver 3.2(僅限行動版)

在 Nginx + Apache 伺服器上檢查網站快取與伺服器內部快取後發現,WordPress 的頁面要求會從瀏覽器開始,依序往下經過 CDN、頁面快取、OPcache、Redis,並在有副本的那一層停下。直接進入原始伺服器的頁面要求,由 nginx 直接送出 WP Rocket 產生的 HTML 檔案,不會往下到 PHP 與資料庫。

Ⅰ. WordPress 快取結構

在電腦中,快取是暫時存放資料以便快速存取的技術,在網路上也以同樣的原理運作,對提升效能有很大的幫助。

快取把資料存起來,訪客造訪網站時就不必每次都向伺服器重新要求,而是快速讀取已儲存的資料,縮短頁面載入時間。這樣能減輕伺服器負載,並改善使用者體驗。

WordPress 要求所使用的快取分為網站快取與伺服器內部快取兩大類。 HTTP 快取標準將只存放在單一訪客瀏覽器中的快取分為 private cache,把多位訪客共用的 CDN·代理快取分為 shared cache,本文將這兩者合稱為網站快取。

頁面快取、OPcache 與物件快取,是附加在伺服器內 WordPress 執行過程中的快取。HTTP 標準沒有另外分類,而 WordPress 官方文件則分為快取外掛(頁面快取)、物件快取、伺服器快取(OPcache 這類 opcode 快取)來說明。

🗂️ WordPress 要求會經過的快取
🌐 網站快取HTTP 快取 · MDN 分類
private cache瀏覽器快取
shared cache
proxy cache公司·電信業者網路中的代理
managed cacheCDN · 反向代理(Varnish)
🖥️ 伺服器內部快取WordPress 官方文件分類
頁面快取快取外掛產生的靜態 HTML(WP Rocket)
OPcacheopcode 快取 · PHP 執行
物件快取要求結束後仍保留的資料(Redis)

快取被使用的所有領域,整理在 快取:定義與快取被使用的所有領域 這篇文章;包含快取在內的效能最佳化四大類,則整理在 網頁效能最佳化:結構與定義 這篇文章。

在下方模擬器中,從左側樹狀圖選擇快取並按下標籤,就能看到要求在哪一層停下。WordPress 網站管理者用快取外掛最先開啟的是頁面快取。

🧭 快取層模擬器說明模擬器
🗂️ WordPress 要求會經過的快取
🧰 要求類型
瀏覽器快取
存放在訪客瀏覽器中的 HTTP 快取。選擇 [圖片 · CSS] 後按 [First visit] → [Visit again],從第二次起就不會再向伺服器送出要求。
HTTP 快取標頭
這是伺服器告訴瀏覽器與 CDN 要保存多久的規則。回應紀錄中的標頭行,是從 Nginx + Apache 伺服器取得的實際值。
CDN · 代理快取
多位訪客共用的副本。開啟 [Use CDN] 後按 [First visit] → [Visit again],回應就在邊緣節點結束。
頁面快取
把 PHP 產生的 HTML 存成檔案。按下 [Visit again],要求就不會往下到 PHP 與資料庫。
OPcache
把編譯好的 PHP 位元組碼放在記憶體中。在 [Visit after editing the post] 中,PHP 會再次執行,但會略過編譯。
物件快取
把查詢結果存到 Redis。在 [Visit after editing the post] 中,只會從 MariaDB 重新讀取改過的文章資料。
整體流程
要求由上往下走,在第一個有副本的層停下。
層儲存位置儲存內容Nginx + Apache 範例
瀏覽器快取訪客裝置HTML·CSS·JS·圖片·字型CSS·圖片 7 天
CDN·代理快取伺服器前端(邊緣節點·反向代理)頁面·靜態檔案副本Bunny CDN
頁面快取伺服器磁碟·記憶體PHP 產生的 HTMLWP Rocket + nginx
OPcache伺服器記憶體PHP 位元組碼PHP 8.3,JIT 關閉
物件快取伺服器記憶體查詢結果·物件Redis
只在瀏覽器中運作的說明用模擬器。回應紀錄中的標頭行是 2026 年 10 月 10 日從 Nginx + Apache 伺服器取得的值,像修改後 ETag 這類括號中的值則是範例。

Ⅱ. 網站快取

網站快取,是伺服器透過回應標頭告知儲存方式後,訪客的瀏覽器與 CDN·代理依照指示存放副本的快取。代表性的標頭有 [Cache-Control]·[ETag]·[Expires],儲存期限過後,會用條件式要求([304 Not Modified])確認是否有變更。

1️⃣ 瀏覽器快取

瀏覽器快取是存放在訪客網頁瀏覽器中的 HTTP 快取,會儲存 HTML·CSS·JavaScript·圖片·字型,再次要求同一個資源時,不是完全不連到伺服器,就是只確認是否有變更。

儲存期限由伺服器決定,而不是訪客。下方的 Nginx + Apache 伺服器對 CSS 與圖片指示保存 7 天,HTML 頁面則不給期限,回應成每次再造訪時都要確認。

📨 回應標頭實測Nginx + Apache 架構 · 2026-10-10
💻 訪客電腦瀏覽器快取
──────▶① 第一次要求GET /style.css
🖥️ 網站伺服器Nginx + Apache
💻 訪客電腦瀏覽器快取
◀──────② 檔案 + 儲存指示cache-control: max-age=604800
🖥️ 網站伺服器Nginx + Apache
③ 瀏覽器依指示保存 7 天,這段期間再次造訪時不會向伺服器送出要求。
💻 訪客電腦瀏覽器快取
──────▶④ 過期後確認If-None-Match: "6ab12775-2ee8"
🖥️ 網站伺服器Nginx + Apache
💻 訪客電腦瀏覽器快取
◀──────⑤ 沒有變更HTTP/2 304(沒有本文)
🖥️ 網站伺服器Nginx + Apache
🖼️ CSS · 圖片
cache-control: max-age=604800
expires: Sat, 17 Oct 2026 03:21:00 GMT
etag: "6ab12775-2ee8"
瀏覽器 7 天 都直接使用已儲存的副本,不再向伺服器確認。
📄 HTML 頁面
etag: "6ac9298c-95575"
last-modified: Fri, 09 Oct 2026 17:51:08 GMT
沒有儲存期限的指示,所以再次造訪時會先用 ETag 詢問是否有變更。
用同一個 ETag 再次要求時,伺服器只會回傳不含本文的 [HTTP/2 304],瀏覽器則直接使用已儲存的副本。

2️⃣ CDN · 代理快取

CDN·代理快取位於訪客與原始伺服器之間,由多位訪客共用。正向代理像企業網路那樣位在訪客端前方,反向代理與 CDN 則位在伺服器前方,以儲存的副本代替原始伺服器回應。

代表性的反向代理是 Varnish Cache,Bunny CDN·Akamai 等 CDN 也採用相同結構。使用分地區 DNS 時,可以讓原始伺服器所在地區的訪客直接連到原始伺服器,其他地區的訪客則由最近的 CDN 邊緣節點(例如 Bunny CDN)連同 HTML 一起儲存並回應。

👤 原始伺服器所在地區的訪客DNS 給出原始位址
→
🖥️ 原始伺服器不經過 CDN,直接回應。
👤 其他地區的訪客DNS 給出最近的邊緣節點位址
→
☁️ Bunny CDN 邊緣節點有 HTML·檔案副本時就在這裡回應。
→
🖥️ 原始伺服器只有邊緣節點沒有副本時才會到這裡。

CDN 的結構與好處,整理在 什麼是 CDN?使用 CDN 的理由與 5 個好處 這篇文章。

Ⅲ. 伺服器內部快取

伺服器內部快取,是要求抵達原始伺服器後,附加在 WordPress 產生頁面過程中的快取。以 Nginx + Apache 架構的伺服器依下列順序處理要求,前面的步驟找到副本,就不會經過後面的步驟。

🅐 頁面快取有檔案時未登入訪客的大多數頁面要求
① nginx 接收要求網頁伺服器接收抵達原始伺服器的要求。
↓
1️⃣ 頁面快取 ↓② 以頁面快取檔案回應nginx 直接送出 WP Rocket 產生的 HTML 檔案。x-rocket-nginx-serving-file: HIT
不經過 PHP · OPcache · Redis · MariaDB 就結束。
🅑 頁面快取沒有檔案時清除快取後的第一次造訪 · 登入畫面 · AJAX 要求
① nginx 接收要求沒有檔案,所以交給 Apache。
↓
2️⃣ OPcache ↓② 執行 PHP · OPcache以編譯好的位元組碼執行 WordPress 的 PHP 檔案。
↓
3️⃣ 物件快取 ↓③ 物件快取(Redis)已儲存的查詢結果·物件從 Redis 取得。
↓
④ MariaDB只查詢 Redis 中沒有的資料,常用資料則從 InnoDB 緩衝池(記憶體)讀取。
↓
⑤ 回應 · 儲存頁面快取送出完成的 HTML,並由 WP Rocket 存成檔案,下一個要求就以 🅐 處理。
以 Nginx + Apache 架構為準(只有沒有頁面快取檔案時才交給 Apache·PHP),2026-10-10 確認。

Cloudways 與 ScalaHosting 都能把 Nginx + Apache 架構當作選項來選擇。Cloudways 可在每個應用程式選擇 Hybrid Stack(Nginx + Apache)或 Lightning Stack(只有 Nginx),ScalaHosting 則可在 SPanel 開啟在 Apache 前面加上 Nginx 的設定。

🖥️ 可選擇 Nginx + Apache 架構的主機
Cloudways每個應用程式選擇堆疊
Hybrid StackNginx + Apache
Lightning Stack只有 Nginx
Cloudways →
ScalaHostingSPanel 網頁伺服器設定
預設Apache
開啟 NginxNginx + Apache
ScalaHosting →
快取儲存內容儲存時機
1️⃣ 頁面快取完成的 HTML 頁面🅑 ⑤ 回應時由 WP Rocket 存成檔案
2️⃣ OPcache編譯好的 PHP 程式碼(位元組碼)🅑 ② 第一次執行 PHP 檔案時
3️⃣ 物件快取查詢結果·選項等資料片段🅑 ③ WordPress 第一次取出資料時

1️⃣ 頁面快取

  • ↪️ 全頁快取或 HTML 快取

頁面快取也稱為全頁快取(full-page cache),因為存的是 HTML,也有人稱為 HTML 快取。它把 PHP 產生的整個網頁存成靜態 HTML 檔案,同一個頁面要求進來時不執行 PHP,直接送出這個檔案。這是上面處理順序中 🅐 的情況。

儲存位置是伺服器記憶體(RAM)或磁碟(HDD/SSD);記憶體速度快,但成本高、容量有限,磁碟容量充足,但相對較慢。

類型範例儲存·回應方式
快取外掛WP Rocket · WP Super Cache · W3 Total Cache · Cache EnablerWordPress 把頁面存成 HTML 檔案,由網頁伺服器送出該檔案。
網頁伺服器快取Nginx FastCGI 快取 · LiteSpeed Cache網頁伺服器直接儲存 PHP 的回應,送給下一個要求。
反向代理快取Varnish放在網頁伺服器前面的快取伺服器儲存頁面並回應。

在 Nginx + Apache 架構下,nginx 會直接讀取並送出 WP Rocket 產生的 HTML 檔案,回應標頭會加上 [x-rocket-nginx-serving-file: HIT]。用 WP Rocket 開啟並設定頁面快取的步驟,整理在 WP Rocket 設定教學 這篇文章。

2️⃣ OPcache

OPcache 把預先編譯好的 PHP 位元組碼存在記憶體,再次執行同一個檔案時就不必經過 PHP 剖析器。它從 PHP 5.5 起就內建,以前使用的 APC 與 XCache 不支援 PHP 7,現在已經不用了。這相當於上面處理順序 🅑 的第 ② 步。

類型狀態說明
Zend OPcachePHP 5.5 起內建目前使用的標準 opcode 快取,以 [opcache.enable=1] 開啟。
OPcache JITPHP 8 起包含在 OPcache 中把位元組碼再轉成機器碼執行,以 [opcache.jit] 開關。
APC已停止開發OPcache 之前使用的 opcode 快取,資料快取功能由 APCu 延續。
XCache已停止開發不支援 PHP 7。
WinCacheWindows(IIS)伺服器用WordPress 官方文件與 OPcache 一起列出的 opcode 快取。

OPcache 以 PHP 設定 [opcache.enable=1] 開啟,PHP 8 之後加入的 JIT 可用 [opcache.jit=disable] 另外關閉。安裝與設定請參考 Zend OPcache 概念與安裝設定 這篇文章。

3️⃣ 物件快取

物件快取把資料庫查詢結果或計算好的物件存到 Redis·Memcached 這類記憶體儲存區。WordPress 預設只在單一要求內記住物件,要接上 Redis 這類儲存區,結果才會在要求結束後保留下來。這相當於上面處理順序 🅑 的第 ③ 步。

類型類別要求結束後是否保留說明
WP_Object_CacheWordPress 預設否只在單一要求內記住的內建快取。
Redis物件快取是獨立的記憶體儲存區,透過 Redis Object Cache 外掛的 drop-in 連接。
Memcached物件快取是獨立的記憶體儲存區。
APCu物件快取是(同一台伺服器內)存放在 PHP 使用的共享記憶體。
檔案物件快取是以檔案形式存放在磁碟。
InnoDB 緩衝池資料庫自身的快取 · 不是物件快取是MySQL·MariaDB 把資料表資料與索引載入記憶體。
查詢快取資料庫自身的快取 · 不是物件快取—MySQL 8.0 已移除,MariaDB 仍保留但預設關閉。

WordPress 透過 Redis Object Cache 外掛加入的 drop-in 檔案([object-cache.php])連接 Redis。安裝過程請參考 WordPress Redis Cache 安裝與設定 這篇文章。

🔢 FAQ & 推薦內容

這是頁面快取或 CDN 中殘留的舊副本在回應。請在快取外掛中清除那篇文章的快取,如果有使用 CDN,也一併清除 CDN 上的副本。

WP Rocket 這類頁面快取外掛,預設不會把儲存的頁面送給已登入的使用者。管理後台與登入狀態下的頁面每次都由 PHP 重新產生,這時由 OPcache 與物件快取撐住速度。

在 Chrome 按 [Ctrl+Shift+R](Mac 為 [Cmd+Shift+R]),就能不透過快取重新載入目前頁面。要清除所有已儲存的快取,請從右上角 [更多] → [刪除瀏覽資料] 選擇 [快取圖片和檔案] 後刪除。

💾 快取相關文章 10 篇
🗂️ 快取
📋 快取:定義與所有領域 📄 網站快取 & 伺服器內部快取
📋 WP Rocket 設定教學 📝 Zend OPcache 📝 安裝 Redis Cache
📝 什麼是 CDN? 📝 Varnish Cache
📋 WP Rocket 速度測試 📝 速度改善案例 📝 快取 · 最佳化外掛

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 8   +   1   =