APCu (Alternative PHP Cache - User Cache) 是 APC 專案中移除 opcode 快取功能後,專注於**使用者資料快取**的擴充套件。自 PHP 5.5 起,PHP 核心內建了 Zend OPcache 處理 opcode 快取,因此 APCu 成為補充鍵值快取的標準選擇。適用於快取資料庫查詢結果、API 回應、運算結果等,顯著降低響應延遲。
php -v 或 phpinfo(),記下:
php_apcu-<版本>--ts/nts-vc<編譯器>-x86/x64.zip 。php_apcu.dll 複製到 PHP ext/ 目錄。extension=apcu apc.enabled=1 apc.shm_size=128M ; 共享記憶體大小,依伺服器 RAM 調整 apc.ttl=3600 ; 預設存活秒數 (0=永不超時) apc.gc_ttl=3600 ; 垃圾回收存活秒數 apc.entries_hint=4096 ; 預估條目數,優化哈希表大小 apc.enable_cli=1 ; CLI 模式啟用 (測試/排程任務需求)
php -m | findstr apcu 或瀏覽 phpinfo() 搜尋 apcu 區塊。# Ubuntu/Debian sudo apt-get update sudo apt-get install php-apcu # 系統套件版本 (可能較舊) # 或使用 PECL 安裝最新版 sudo pecl install apcu echo "extension=apcu.so" | sudo tee /etc/php/8.2/mods-available/apcu.ini sudo phpenmod apcu sudo systemctl restart php8.2-fpm # CentOS/RHEL (Remi repo) sudo yum install php-pecl-apcu # 或 sudo pecl install apcu
<?php
// 寫入快取 (key, value, ttl秒)
apcu_store('user:1001', ['name' => 'John', 'role' => 'admin'], 3600);
// 讀取快取
$user = apcu_fetch('user:1001');
if ($user === false) {
// 快取未命中,查詢資料庫...
$user = $db->query("SELECT * FROM users WHERE id=1001");
apcu_store('user:1001', $user, 3600);
}
// 刪除快取
apcu_delete('user:1001');
// 批次操作
apcu_store(['config:site_name' => 'MySite', 'config:theme' => 'dark'], 86400);
$config = apcu_fetch(['config:site_name', 'config:theme']);
// 遞增/遞減計數器 (原子操作)
$visits = apcu_inc('page:home:visits'); // 回傳新值
$stock = apcu_dec('product:999:stock'); // 扣減庫存
// 取得快取資訊
$info = apcu_cache_info(); // 含命中率、記憶體使用、條目數等
print_r($info);
?>
| 參數 | 建議值 | 說明 |
|---|---|---|
| apc.shm_size | 128M~512M | 視熱門資料總量與可用 RAM 設定,避免佔用過多導致 Swap |
| apc.ttl | 300~3600 | 0 代表永不超時,易造成記憶體洩漏;建議設定合理 TTL 配合業務更新頻率 |
| apc.entries_hint | 預估條目數 * 1.5 | 預先分配哈希表槽位,減少重新雜湊開銷 |
| apc.serializer | default / php / igbinary | 安裝 igbinary 擴充套件並設定 apc.serializer=igbinary 可提升序列化速度 30%+ |
| apc.preload_path | /path/to/preload | 啟動時自動載入目錄下 .php 檔案定義的陣列至快取,適合靜態配置 |
Unable to load dynamic library 'apcu' → 確認 DLL/so 檔案架構、TS/NTS、PHP 版本完全一致;Windows 需將 php_apcu.dll 放入 ext/,Linux 需確認 extension=apcu.so 路徑正確。apcu_cache_info() 的 num_hits / num_misses,調整 TTL、增加 shm_size、檢查是否有大量短命鍵值污染快取。__destruct / __wakeup 中呼叫 APCu 函式,或升級至 APCu 5.1.22+。| 特性 | APCu | Redis | Memcached |
|---|---|---|---|
| 儲存模式 | 本機共享記憶體 | 網路記憶體資料結構伺服器 | 網路分散式記憶體快取 |
| 資料結構 | 單純 Key-Value | String, Hash, List, Set, Sorted Set, Stream... | Key-Value |
| 持久化 | 不支援 (重啟遺失) | RDB/AOF 可選 | 不支援 |
| 跨伺服器共享 | 無法 | 原生叢集/哨兵 | Client-side 一致性雜湊 |
| 適用場景 | 單機高頻熱點資料、Session (單機)、Composer 快取 | 分散式快取、排行榜、發布訂閱、分散式鎖、Session 叢集 | 簡單分散式快取、大量小物件、多語言共享 |
APCu 是單機 PHP 應用極速快取的利器,安裝簡單、零網路延遲、API 極簡。合理配置 shm_size、ttl、serializer 並監控命中率,即可榨乾記憶體效能。若架構演進為多伺服器叢集,平滑遷移至 Redis 是自然選擇。