首先打开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