APC (Alternative PHP Cache) 是 PHP 5.5 前最主流的 Opcode 快取擴充套件,PHP 5.5+ 內建 OPcache 取代之。本文為維護舊專案(PHP 5.3/5.4)或理解 Opcode 快取原理而整理,涵蓋核心函數、配置參數、優勢與使用陷阱。
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']);
apc_define_constants 避免重複 define() 開銷(官方建議改用 hidef 擴充套件)。apc.shm_size 可能碎片化,定期重啟或監控 apc_cache_info() 的 fragmentation 指標。| APC 功能 | PHP 5.5+ 替代方案 |
|---|---|
| Opcode Cache | OPcache (內建,opcache.enable=1) |
| User Cache | APCu (PECL 擴充套件,API 幾乎相同) |
| 分散式快取 | Redis / Memcache |
| 常數快取 | hidef (PECL) 或 直接 define |
APC 是 PHP 快取發展史上的里程碑,其進程內共享記憶體、自旋鎖、Opcode+User 一體的設計思想深深影響後續 OPcache、APCu、Redis 模組。維護舊專案時請精準配置 shm_size、stat=0、ttl,並嚴格區分「系統級 Opcode 快取」與「業務級 User 快取」的適用邊界。