早期 PHP 加速器(如 PHP Accelerator、Turck MMCache、eAccelerator、XCache、APC)透過快取編譯後的 Opcode 避免重複解析編譯,大幅提升效能。PHP 5.5 起內建 OPcache,取代所有第三方加速器成為標準方案。
; php.ini 範例 (PHP Accelerator 1.3)
zend_extension = /usr/local/lib/php_accelerator_1.3.3r2.so
phpa = on
phpa.tweaks = on
phpa.cache_dir = /tmp
phpa.file_perms = 400
phpa.cache_file_prune_period = 1h
phpa.cache_file_ttl = 1d
phpa.shm_size = 10
phpa.shm_key = 0xc0deb00
phpa.shm_perms = 666
phpa.shm_user = nobody
phpa.shm_group = nobody
phpa.shm_release_at_exit = on
phpa.shm_stats_check_period = 5m
phpa.shm_ttl = 12h
phpa.shm_max_processes = 512
phpa.shm_lock_threshold0 = 10
重新載入 Apache:apachectl graceful
; php.ini (PHP 7.4+ 推薦)
[opcache]
zend_extension=opcache.so ; Windows: php_opcache.dll
opcache.enable=1
opcache.enable_cli=1 ; CLI 模式也啟用(長期執行腳本受益)
opcache.memory_consumption=256 ; 共享記憶體大小 (MB),視專案大小調整
opcache.interned_strings_buffer=16 ; 內部字串緩衝區
opcache.max_accelerated_files=20000 ; 最大快取檔案數,設定大於專案總 .php 檔數
opcache.revalidate_freq=2 ; 檢查檔案更新頻率(秒),開發環境設 0,生產 2-60
opcache.fast_shutdown=1 ; 快速關閉(PHP 7.2+ 已內建優化)
opcache.save_comments=1 ; 保留註解(註解解析器/框架需要)
opcache.enable_file_override=0 ; 不覆蓋 file_exists 等函數行為
; opcache.validate_timestamps=1 ; 生產環境建議 1,配合 deploy 後重啟 php-fpm 或 opcache_reset()
; opcache.file_cache=/tmp/opcache ; 檔案快取備援(PHP 7.0+)
; opcache.file_cache_only=0
| 參數 | 建議值 | 影響 |
|---|---|---|
| memory_consumption | 128-512 MB | 過小導致快取滿載頻繁清除,過大浪費記憶體 |
| max_accelerated_files | > 專案 .php 總數 | 質數效能最佳(如 20011, 50021) |
| revalidate_freq | 0 (開發) / 10-60 (生產) | 0 即時生效但有效能開銷;生產環境部署後需重啟或呼叫 opcache_reset() |
| validate_timestamps | 1 (生產) | 關閉需手動清除快取,適合不可變部署(Docker 映像) |
php -r "print_r(opcache_get_status());"hit_rate (命中率) 應 > 90%,memory_usage.used_memory < free_memory。systemctl reload php-fpm) 或呼叫 opcache_reset()。opcache.save_comments、opcache.enable_file_override 設定。memory_consumption 或減少 max_accelerated_files。PHP Accelerator 等早期專案已完成歷史使命。現代 PHP 專案請直接啟用並調校 OPcache,搭配 Composer 自動載入最佳化(composer dump-autoload -o)、JIT(PHP 8.0+)即可獲得極致效能。