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

PHP APC 快取擴充套件完整指南:核心函數、配置優化與效能優勢分析

     編輯:PHP 綜合知識

前言

APC (Alternative PHP Cache) 是 PHP 5.5 前最主流的 Opcode 快取擴充套件,PHP 5.5+ 內建 OPcache 取代之。本文為維護舊專案(PHP 5.3/5.4)或理解 Opcode 快取原理而整理,涵蓋核心函數、配置參數、優勢與使用陷阱。

一、 APC 兩大快取層面

  1. Opcode Cache(系統快取): 快取編譯後的腳本位元碼,避免重複編譯,自動生效,無需代碼修改。
  2. User Cache(用戶快取): 供 PHP 代碼手動存取的 Key-Value 存儲(apc_store/fetch),類似 Memcache 但進程內、無網路開銷。

二、 核心用戶快取函數

函數用途備註
apc_store($key, $var, $ttl=0)儲存變數$ttl=0 永不過期
apc_fetch($key, &$success=null)取得變數$success 回傳是否找到
apc_delete($key)刪除變數
apc_exists($keys)檢查鍵是否存在單一字串或陣列,回傳存在的鍵陣列
apc_add($key, $var, $ttl)僅當鍵不存在時儲存原子操作,避免競態
apc_inc/dec($key, $step=1, &$success)原子增減適用於計數器
apc_clear_cache('user')清除用戶快取參數 'user' 或 'opcode'
apc_cache_info('user', $limited=false)取得快取統計命中率、記憶體用量、條目數
apc_define_constants($key, $constants, $case_sensitive)批次定義常數快取配合 apc_load_constants
apc_compile_file($file, $atomic=true)強制編譯並快取檔案繞過 filters 限制
apc_delete_file($files)從 Opcode 快取移除檔案部署更新後呼叫

三、 關鍵配置參數

; php.ini / apc.ini
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128M          ; 共享記憶體總量(Opcode + User),建議 128M-256M+
apc.num_files_hint=4096    ; 預估腳本檔案數
apc.user_entries_hint=4096 ; 預估用戶快取條目數
apc.ttl=7200               ; Opcode 條目最大存活秒數(0=永久,建議 3600-7200)
apc.user_ttl=7200          ; User 快取最大存活秒數
apc.gc_ttl=3600            ; GC 表條目存活秒數
apc.stat=0                 ; 生產環境關閉檔案修改檢查(大幅提升效能),部署後需重啟 PHP-FPM/Apache
apc.filters=""             ; 正則過濾不快取的檔案(如 "-/var/www/dev/.*")
apc.mmap_file_mask=/tmp/apc.XXXXXX  ; mmap 匿名映射(推薦)
apc.write_lock=1           ; 寫入鎖,防止併發編譯衝突
apc.slam_defense=0         ; 舊版防撞機制,建議關閉改用 write_lock
apc.rfc1867=0              ; 上傳進度快取(需前端配合)
apc.lazy_functions=0       ; 惰性載入函數(實驗性)
apc.lazy_classes=0         ; 惰性載入類別(實驗性)

四、 進階使用範例

<?php
// 1. 快取系統設定(部署期間不變)
$config = ['site_name' => 'MySite', 'theme' => 'dark'];
apc_store('app_config', $config);

// 2. 快取資料庫查詢結果(TTL 5 分鐘)
$key = 'top_articles_'.$category_id;
if (!($articles = apc_fetch($key))) {
    $articles = $db->query("SELECT * FROM articles WHERE cat=$category_id ORDER BY views DESC LIMIT 10");
    apc_store($key, $articles, 300);
}

// 3. 原子計數器
$views = apc_inc('article_views_'.$id, 1, $success);
if (!$success) {
    $views = 1;
    apc_store('article_views_'.$id, 1);
}

// 4. 部署後清除 Opcode 快取(需在 CLI/Web 執行)
apc_clear_cache('opcode');
// 或針對特定檔案
apc_delete_file(['/var/www/index.php', '/var/www/config.php']);

五、 優勢分析

  1. 零網路開銷: 共享記憶體直接讀寫,比 Memcache/Redis 省去 TCP 協議、序列化/反序列化。
  2. 自旋鎖: 內部使用 spinlock,極低併發爭用開銷。
  3. Opcode + User 整合: 單一擴充套件解決編譯快取與資料快取。
  4. apc.php 管理介面: 內建 Web UI 監控命中率、記憶體碎片、條目列表。
  5. 常數快取: apc_define_constants 避免重複 define() 開銷(官方建議改用 hidef 擴充套件)。

六、 避坑指南

  • 不適用於高頻變更的用戶資料: Session、購物車、即時狀態請用 Redis/Memcache/DB,APC 無分散式同步、重啟遺失、無淘汰策略精確控制。
  • 單機限制: 無原生叢集支援,多伺服器需靠 sticky session 或外部分散式快取。
  • stat=0 部署流程: 程式碼更新後必須重啟 PHP-FPM/Apache 才生效,否則舊 Opcode 持續服務。
  • 記憶體碎片: 長期運行 apc.shm_size 可能碎片化,定期重啟或監控 apc_cache_info() 的 fragmentation 指標。
  • PHP 5.5+ 棄用: 改用 OPcache (Opcode) + APCu (User Cache) 或 Redis/Memcache。

七、 遷移建議

APC 功能PHP 5.5+ 替代方案
Opcode CacheOPcache (內建,opcache.enable=1)
User CacheAPCu (PECL 擴充套件,API 幾乎相同)
分散式快取Redis / Memcache
常數快取hidef (PECL) 或 直接 define

結語

APC 是 PHP 快取發展史上的里程碑,其進程內共享記憶體、自旋鎖、Opcode+User 一體的設計思想深深影響後續 OPcache、APCu、Redis 模組。維護舊專案時請精準配置 shm_size、stat=0、ttl,並嚴格區分「系統級 Opcode 快取」與「業務級 User 快取」的適用邊界。

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