首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP APC 緩存完整指南:安裝、配置、原理與實戰應用

     編輯:PHP 綜合知識

APC 緩存簡介

APC(Alternative PHP Cache) 是 PHP 的 opcode 緩存擴展,透過將編譯後的中間代碼(opcode)存放在共享記憶體中,避免重複編譯 PHP 腳本,大幅提升執行效能。APC 緩存分為兩大類:

  • 系統緩存:自動緩存 PHP 檔案編譯後的 opcode。每次請求比對檔案修改時間(mtime),未過期則直接使用緩存 opcode。預設 TTL 3600 秒。
  • 用戶資料緩存:開發者透過 apc_store()、apc_fetch() 等 API 手動存取的鍵值資料,適用於配置、計數器、計算結果等熱門資料。
重要提示:APC 自 PHP 5.5 起被 OPcache 取代內建於 PHP 核心。新專案請優先使用 OPcache + Redis/Memcached 架構。本文適用於維護 PHP 5.4 或舊版專案。

核心運作原理

緩存鍵生成機制

  • 用戶緩存鍵:經 apc_cache_make_user_key(),對開發者提供的字串鍵使用 PHP 內核 hash 函數(zend_inline_hash_func)生成 h 值,決定槽位。
  • 系統緩存鍵:經 apc_cache_make_file_key()。
    • apc.stat=On:h = device + inode,檔案更新自動重新編譯。
    • apc.stat=Off:h = 絕對路徑 hash,修改檔案需重啟 Web 服務生效,效能最佳。

寫入流程(以用戶緩存為例)

  1. apc_store() → _apc_store() → apc_cache_make_user_entry()
  2. 計算槽位:slot = cache->slots[key.h % cache->num_slots]
  3. 遍歷槽位鏈表,移除同鍵或過期條目
  4. 插入新條目至鏈表尾端

安裝部署

Windows 環境

  1. 下載對應 PHP 版本、TS/NTS、VC 編譯版本的 php_apc.dll(PECL 官網)
  2. 放入 ext/ 目錄
  3. 修改 php.ini:
    extension=php_apc.dll
    apc.rfc1867 = on          ; 啟用上傳進度追蹤
    apc.max_file_size = 100M  ; 最大緩存檔案
    upload_max_filesize = 100M
    post_max_size = 100M
  4. 重啟 Web 服務,phpinfo() 驗證

Linux 環境(編譯安裝)

wget https://pecl.php.net/get/APC-3.1.13.tgz
tar -zxvf APC-3.1.13.tgz
cd APC-3.1.13
/usr/local/php/bin/phpize
./configure --enable-apc --enable-mmap --enable-apc-spinlocks \
            --disable-apc-pthreadmutex \
            --with-php-config=/usr/local/php/bin/php-config
make && sudo make install

修改 /usr/local/php/etc/php.ini 加入配置段(見下節),重啟 PHP-FPM/Apache。

核心配置參數詳解

參數類型預設說明與調優建議
apc.enabledbool1總開關。靜態編譯時唯一禁用途徑
apc.shm_segmentsint1共享記憶體分段數。單段受限於系統上限時可增加
apc.shm_sizeint32M關鍵參數。每段大小(MB)。根據專案檔案數與用戶資料量調整,建議 128M~512M
apc.optimizationint0優化等級(實驗性),0 關閉,>0 啟用,生產環境建議 0
apc.num_files_hintint1000預估不同源檔案數。大型站點(成千檔案)需調大,避免重新 hash
apc.ttlint0關鍵。緩存條目最大存活秒數。0=永不自動過期(需手動清理或重啟)。生產建議 7200~86400 或 0 配合部署流程清理
apc.gc_ttlint3600垃圾回收列表存活秒數。防止請求中斷導致舊版本 opcode 殘留
apc.cache_by_defaultboolOnOn=緩存所有檔案。Off 搭配 filters 白名單模式
apc.filtersstringPOSIX 正則清單。+ 開頭=白名單,- 開頭=黑名單。匹配 include/require 參數而非絕對路徑
apc.mmap_file_maskstringMMAP 檔案遮罩。/tmp/apc.XXXXXX(檔案支援)、/apc.shm.XXXXXX(POSIX shm)、/dev/zero(匿名映射,推薦)
apc.slam_defenseint1防群體衝突機率(%)。高併發時設 75~90 降低同時重建 opcode 機率。0 關閉
apc.file_update_protectionint2檔案修改後延遲緩存秒數。防止讀到寫入中的檔案。原子部署(mv)可設 0
apc.enable_cliint0CLI 模式啟用 APC。僅供測試/除錯,生產 CLI 腳本建議關閉
apc.statboolOn效能關鍵。On=每請求 stat 檢查 mtime。Off=極致效能,部署需重啟服務
apc.include_once_overrideboolOff優化 include_once/require_once。實驗性,慎用
apc.lazy_functions / apc.lazy_classesint0延遲載入函數/類別定義。大型框架專案可嘗試 1

使用最佳實踐總結

  1. 鎖機制:編譯時加入 --enable-apc-spinlocks 使用自旋鎖,高併發下效能優於 pthread mutex。
  2. 監控工具:善用 apc.php(解壓套件內附),務必修改預設管理員帳密。
  3. 記憶體模型:APC 以 mmap 匿名映射建立共享記憶體,由 APC 內部管理分配。
  4. 參數調優循環:觀察 apc.php 統計 → 調整 shm_size、num_files_hint、user_entries_hint → 重啟驗證 → 重複直到命中率 > 95%、碎片率 < 10%。
  5. 生產環境 apc.stat=0:部署流程需包含「重啟 PHP-FPM/Apache」步驟,換取最大效能。
  6. 常數緩存:使用 apc_define_constants() 緩存大量常數定義,優於 define()。但 PECL hidef 效能更佳。
  7. 系統配置類資料:全生命週期、唯讀、跨請求共享的資料(如路由表、配置陣列)極適合 APC,避免網路往返。
  8. 高頻變更資料勿用 APC:Session、購物車、即時計數等頻繁寫入資料會導致鎖競爭、資料不一致,請改用 Redis/Memcached。

實戰封裝類別範例

<?php
/**
 * APC 緩存操作封裝
 * 適用於 PHP 5.4 / APC 3.1.x 環境
 */
class ApcCache {
    /** 寫入緩存 */
    public function set($key, $value, $ttl = 0) {
        // $ttl=0 表示永久(受 apc.ttl 限制)
        return apc_store($key, $value, $ttl ?: null);
    }

    /** 讀取緩存 */
    public function get($key) {
        return apc_fetch($key);
    }

    /** 刪除單個鍵 */
    public function delete($key) {
        return apc_delete($key);
    }

    /** 清空用戶緩存(謹慎使用) */
    public function clearAll() {
        apc_clear_cache('user');
        return apc_clear_cache(); // 同時清除系統緩存 opcode
    }

    /** 檢查鍵是否存在 */
    public function exists($key) {
        return apc_exists($key);
    }

    /** 原子增長(計數器) */
    public function increment($key, $step = 1) {
        return apc_inc($key, (int)$step);
    }

    /** 原子減少 */
    public function decrement($key, $step = 1) {
        return apc_dec($key, (int)$step);
    }

    /** 獲取緩存統計資訊 */
    public function getStats() {
        return apc_cache_info();
    }
}

// 使用範例
$cache = new ApcCache();
$cache->set('app_config', ['debug' => false, 'version' => '1.2.3'], 3600);
$config = $cache->get('app_config');
$cache->increment('page_views');

遷移建議:從 APC 到現代架構

APC 功能現代替代方案 (PHP 5.5+)
Opcode 緩存OPcache(內建,opcache.enable=1)
用戶資料緩存Redis(推薦,功能豐富)或 Memcached(簡單、多執行緒)
上傳進度追蹤Session 上傳進度(session.upload_progress.enabled=1)或前端 AJAX 輪詢
apc.php 監控Redis INFO / Memcached stats / 專用監控系統(Prometheus+Grafana、Datadog 等)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved