Alternative PHP Cache (APC) 是一個免費、開源的 PHP 擴展,專門用於緩存和優化 PHP 的中間代碼 (opcode)。透過將編譯後的腳本存放在共享記憶體中,APC 能夠省去每次請求都重新解析、編譯的開銷,大幅提升 PHP 應用的執行速度。
在 Windows 系統上運行 APC 時,必須確保存在 c:\tmp 目錄,且該目錄對 Web 服務器進程 (如 IIS 的 IUSR 或 Apache 的 daemon) 具有寫入權限,否則緩存寫入會失敗。
php_apc.dll。ext 目錄。php.ini 中啟用擴展:extension=php_apc.dll (PHP 5.3+) 或 zend_extension_ts=... (舊版)。phpinfo() 確認 APC 區塊出現。以下列出生產環境常用的關鍵設定,建議根據流量與記憶體大小調整:
| 指令 | 建議值 | 說明 |
|---|---|---|
| apc.enabled | On | 總開關,關閉即停用 APC。 |
| apc.shm_size | 128M~256M | 每個共享記憶體區塊大小,視專案程式碼量而定。 |
| apc.num_files_hint | 2048~4096 | 預估會被緩存的不同檔案數,避免重新分配哈希表。 |
| apc.ttl | 7200 (2小時) | 緩存條目存活秒數,0 為永不過期 (不建議,易導致記憶體耗盡)。 |
| apc.user_ttl | 7200 | 用戶緩存 (apc_store) 的 TTL。 |
| apc.gc_ttl | 3600 | 垃圾回收列表中條目最大存活時間,防止舊版本殘留。 |
| apc.stat | Off (生產) / On (開發) | 是否每請求檢查腳本修改時間。生產環境關閉可大幅提升效能,但部署後需重啟服務器。 |
| apc.write_lock | On | 高併發下防止多進程同時編譯同一檔案造成競爭條件。 |
| apc.max_file_size | 1M | 單一檔案超過此大小不緩存,避免大檔案佔滿共享記憶體。 |
| apc.filters | "" | 正則過濾,例如 "+/var/www/app/*,-/var/www/app/cache/*" 僅緩存應用核心代碼。 |
| apc.enable_cli | Off | CLI 模式通常不需要 opcode 緩存,關閉可節省記憶體。 |
apc.stat=Off 時,每次發布新代碼必須 重啟 PHP-FPM / Apache 或發送 SIGUSR2 信號讓 APC 重新掃描,否則舊代碼會持續被執行。apc.php 狀態頁,關注 Free memory 與 Fragmentation,碎片率超過 20% 應考慮增大 apc.shm_size 或重啟服務。apc_store()/apc_fetch() 供應用層資料緩存,適合存放熱門查詢結果、配置陣列等,但注意總大小受 apc.shm_size 限制。<?php
echo 'APC 載入: ', extension_loaded('apc') ? '是' : '否', "\n";
if (extension_loaded('apc')) {
$info = apc_cache_info();
echo '共享記憶體大小: ', $info['memory_size'], " bytes\n";
echo '已用: ', $info['memory_size'] - $info['free_memory'], " bytes\n";
echo '命中率: ', round($info['num_hits'] / ($info['num_hits'] + $info['num_misses']) * 100, 2), "%\n";
}
?>
將上述腳本放在 Web 目錄訪問,即可即時掌握 APC 運行狀態。