善用 HTTP 快取標頭,能大幅減少伺服器請求、提升頁面載入速度。但快取也是雙面刃:靜態資源宜快取,動態內容卻須即時更新。本文系統梳理 PHP 控制瀏覽器快取的核心 Header、常見誤區與實戰策略。
| Header | 用途 | 典型值範例 |
|---|---|---|
Cache-Control | 主控快取行為(HTTP 1.1) | max-age=86400, must-revalidate(24 小時) |
Expires | 絕對過期時間(HTTP 1.0 相容) | gmdate('D, d M Y H:i:s', time()+86400).' GMT' |
Last-Modified | 資源最後修改時間,配合條件請求 | gmdate('D, d M Y H:i:s').' GMT' |
Pragma: no-cache | 禁用快取(HTTP 1.0 相容) | 僅作為備援 |
<?php
// 快取 24 小時
header('Cache-Control: max-age=86400, must-revalidate');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT');
echo '此內容將被瀏覽器快取 24 小時';
?>
瀏覽器在快取有效期內「前進/後退」或點擊連結,直接讀取本地快取(網路面板顯示灰色 304/from disk cache),不發起實際請求。
<?php
// HTTP 1.1
header("Cache-Control: no-cache, must-revalidate");
// HTTP 1.0 相容
header("Pragma: no-cache");
?>
每次請求均向伺服器取得最新內容,適用於後台管理、即時數據、用戶專屬頁面。
JS/CSS 檔案更新後,瀏覽器可能仍讀取舊快取。解法:在 URL 附加版本參數:
<script src="app.js?v=20240115"></script>
<link rel="stylesheet" href="style.css?v=20240115">
檔案內容變更時更新版本號,強制瀏覽器重新下載。
對於圖片、字體、CSS/JS 等靜態資源,建議在 Web 伺服器層面統一設定長效快取(如 expires 1y),減輕 PHP 處理壓力。
啟用 ob_gzhandler 或 Apache mod_deflate,可將文字內容壓縮 60-85%,大幅降低頻寬:
<?php
// PHP 層面啟用輸出壓縮
ob_start('ob_gzhandler');
?>
或在 php.ini:output_handler = ob_gzhandler。
max-age/Expires 到期)掌握快取策略,讓效能優化事半功倍。

