JIT+Opcache如何配置才能达到性能最优

发布于:2025-05-14 ⋅ 阅读:(11) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到