首先打開php.ini文件,進行配置
1、OPcache配置
; 啟用OPcache
opcache.enable=1; CLI環境下啟用OPcache(按需配置)
opcache.enable_cli=0; 預加載腳本(PHP 7.4+,加速常用類)
; opcache.preload=/path/to/preload.php; 分配內存大小(根據項目大小調整,建議128M-512M)
opcache.memory_consumption=256; 最大緩存文件數(建議設置為項目文件數+冗余)
opcache.max_accelerated_files=10000; 內存"浪費"達到此百分比會執行重啟
opcache.max_wasted_percentage=10; 不檢查文件修改時間(生產環境推薦關閉),更新代碼時,重啟php-fpm
opcache.validate_timestamps=0; 每隔多少秒檢查文件更新(若開啟驗證,建議較大值)
opcache.revalidate_freq=60; 優化字符串存儲,(約16MB)適合中型應用
opcache.interned_strings_buffer=16; 快速關閉機制
opcache.fast_shutdown=1; 文件緩存路徑(為空表示僅內存緩存)
opcache.file_cache=/tmp/opcache; 啟用文件緩存(生產環境推薦)
opcache.file_cache_only=0; 優化級別(0-7,推薦0)
opcache.optimization_level=0x7FFFBFFF; 防止腳本重復緩存
opcache.dups_fix=0; 記錄緩存命中率(調試用)
opcache.record_warnings=0; 啟用保護模式
opcache.protect_memory=0; 鎖定內存(避免交換)
opcache.lockfile_path=/tmp; 高級優化
opcache.opt_debug_level=0
opcache.enable_file_override=1
opcache.preload=/path/to/preload.php ; 預加載腳本(可選)
opcache.huge_code_pages=1 ; 啟用大內存頁(Linux)
2、JIT配置
; 啟用JIT并分配緩沖區(建議100M以上)
opcache.jit_buffer_size=100M; JIT模式
opcache.jit=1255 ; JIT 模式(1255 是推薦值); 關閉調試
opcache.jit_debug=0; 生產環境關閉分析
opcache.jit_profiling=0
opcache.jit模式講解:
2.1?數字組合模式
opcache.jit
?的值通常由 4 位數字組成(如?1255
),每位數字代表不同的編譯策略:
第一位:是否使用 AVX 指令(需 CPU 支持)
0
:禁用 AVX 指令1
:啟用 AVX 指令(推薦)
第二位:寄存器分配策略
0
:禁用寄存器分配1
:局部(Block 級)分配2
:全局(Function 級)分配(推薦)
第三位:JIT 觸發策略
0
:腳本加載時編譯所有代碼1
:函數首次執行時編譯2
:基于調用頻率編譯(推薦結合?opcache.prof_threshold
?使用)3
:函數執行超過閾值(opcache.jit_hot_func
)后編譯4
:通過?@jit
?注釋手動觸發編譯5
:基于循環/返回的熱點追蹤(推薦)
第四位:優化級別
0
:禁用優化1
:基礎優化(如跳轉優化)5
:最高優化(腳本級類型推斷、SSA 優化等,推薦)
2.2?關鍵字模式
PHP 8.0+ 支持簡寫關鍵字:
disable
:禁用 JIT(默認值)tracing
:追蹤模式(積極優化循環和熱點代碼)function
:函數級優化(平衡性能與資源消耗)on
:保守策略(僅優化高頻代碼片段)
2.3?推薦配置
最佳性能模式:1255 #
計算密集型任務(如數學運算、循環處理)
通用推薦模式:tracing #
Web 服務、高并發場景
保守模式:function
?或?on #
資源受限環境或對啟動速度敏感的應用
3、檢查opcache是否起作用
執行如下命令
php -r 'print_r(opcache_get_status());'
輸出值如下
Array
([opcache_enabled] => 1 // OPcache 是否啟用[cache_full] => // 緩存是否已滿[restart_pending] => // 是否有重啟掛起(如手動觸發重啟)[restart_in_progress] => // 是否正在重啟[memory_usage] => Array // 內存使用情況([used_memory] => 39923984 //已使用的內存量(字節)[free_memory] => 228511472 //剩余可用內存(字節)[wasted_memory] => 0 //因碎片化等原因浪費的內存(字節),若 wasted_memory 過高,嘗試調整 opcache.fast_shutdown[current_wasted_percentage] => 0 //浪費內存占總內存的百分比(理想應接近 0))[interned_strings_usage] => Array // 內部字符串緩存信息(PHP 7+)([buffer_size] => 25165360 //字符串緩存區總大小(字節)[used_memory] => 508264 //已使用的內存量[free_memory] => 24657096 //剩余可用內存[number_of_strings] => 10625 //緩存的字符串數量)[opcache_statistics] => Array // 統計信息(含命中率)([num_cached_scripts] => 0 //已緩存的腳本數量,接近 max_cached_keys 時可能需要調整配置。[num_cached_keys] => 0 //當前緩存的腳本數量[max_cached_keys] => 130987 //最大可緩存鍵數(由 opcache.max_accelerated_files 定義)[hits] => 0 //命中次數[start_time] => 1747137944 //OPcache 啟動時間戳(秒)[last_restart_time] => 0 //最后一次重啟時間戳(未重啟時為 0)[oom_restarts] => 0 //因內存不足(OOM)觸發的重啟次數[hash_restarts] => 0 //因哈希沖突觸發的重啟次數[manual_restarts] => 0 //手動調用 opcache_reset() 的重啟次數。[misses] => 0 //未命中次數[blacklist_misses] => 0[blacklist_miss_ratio] => 0[opcache_hit_rate] => 0 //越高越好(理想值 > 95%,低于 80% 需檢查配置或代碼更新頻率)。)[scripts] => Array (// 已緩存的腳本詳情["/var/www/index.php"] => Array ("full_path" => "/var/www/index.php",//腳本的完整路徑"hits" => 10,//該腳本的緩存命中次數"memory_consumption" => 32768,//該腳本占用的內存量(字節)"last_used" => "Tue May 14 10:00:00 2024" //最后一次訪問時間(如 "Tue May 14 10:00:00 2024"))
)[jit] => Array([enabled] => 1[on] => 1[kind] => 0[opt_level] => 5[opt_flags] => 6[buffer_size] => 134217712[buffer_free] => 134215280))
4、緩存清理
# 每天凌晨清理緩存
0 3 * * * /usr/bin/php /path/to/your/project/think optimize:clear >> /dev/null 2>&1# 每周重建OPcache
0 4 * * 1 /usr/bin/systemctl restart php-fpm >> /dev/null 2>&1#通過cronjob每天低峰期重啟PHP-FPM:
0 4 * * * /bin/systemctl restart php-fpm