首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 靜態頁面快取類:極光快取降低 CPU 與 MySQL 負載

     編輯:MySQL 資料庫相關知識

核心思想

將動態 PHP 頁面輸出內容快取到檔案系統,設定 TTL(存活時間)。同一 URL + 參數在 TTL 內再次請求,直接讀取快取檔輸出,完全繞過 PHP 邏輯與 MySQL 查詢。

使用範例

<?php
require_once 'arrcache.php';

$cache = new ArrCache('cache', 120, 'txt'); // 目錄、秒數、副檔名

for ($i = 0; $i < 5; $i++) {
    echo $i . ' ';
    sleep(1); // 模擬耗時查詢
}

$cache->endCache(); // 必須放在腳本結尾
?>

首次執行 ~5 秒,第二次瞬間輸出。

核心類原始碼 (arrcache.php)

<?php
ob_start(); // 開啟輸出緩衝

class ArrCache {
    private $path, $time, $fileType, $fileName;

    public function __construct($path, $time = 120, $fileType = 'txt') {
        $this->path = $path;
        $this->time = $time;
        $this->fileType = $fileType;
        // 以 URL + QUERY_STRING 為唯一鍵
        $this->fileName = $_SERVER['DOCUMENT_ROOT'] . '/' . $this->path . '/' . md5($_SERVER['REQUEST_URI']) . '.' . $this->fileType;

        // 快取命中:檔案存在且未過期
        if (file_exists($this->fileName) && (filemtime($this->fileName) + $this->time > time())) {
            readfile($this->fileName);
            ob_end_flush();
            exit; // 直接結束,不執行後續 PHP
        }
    }

    public function endCache() {
        $fp = fopen($this->fileName, 'w');
        fwrite($fp, ob_get_contents()); // 寫入輸出緩衝內容
        fclose($fp);
        ob_end_flush();
    }
}
?>

關鍵設計細節

適用與不適用場景

點處理
快取鍵md5($_SERVER['REQUEST_URI']) 包含查詢字串,不同參數不同快取
過期判斷filemtime + ttl > time()
輸出捕獲ob_start() + ob_get_contents()
提前退出建構子命中時 exit,節省所有後續運算
目錄權限需預先建立 cache/ 並給 PHP 寫入權限
✅ 適合❌ 不適合
內容頁、列表頁、報表、公開 API購物車、訂單、用戶中心(個人化強)
SELECT 為主、資料變動低INSERT/UPDATE/DELETE 頻繁頁面
高流量、低延遲要求需即時性的儀表板、即時通訊

進階改良建議

  1. 快取標籤/群組失效: 以資料表名為標籤,資料異動時批量刪除相關快取檔。
  2. 分散式快取: 單機檔案快取不支援多 Web 節點,改用 Redis/Memcached + 相同介面。
  3. 壓縮儲存: gzencode(ob_get_contents(), 9) 寫入,讀取時 gzinflate(),節省 70% 磁碟空間。
  4. 防止犬群效應: 快取過期時,僅允許 1 個請求重建,其他請求等待或服務舊快取(stale-while-revalidate)。
  5. 安全性: 快取目錄不可直接用 URL 存取(放在 DocumentRoot 外或 Nginx deny all)。

總結

極光快取類展示了 頁面級檔案快取 的最小可行實現:ob_start + md5(URL) + TTL + exit。生產環境建議直接使用成熟方案:Nginx fastcgi_cache / proxy_cache、Varnish、Redis 全頁快取、Laravel Response Cache、Symfony HttpCache,功能更完善(標籤失效、熱鍵保護、分散式、監控)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved