截至2024年9月,PHP 8.5 尚未发布。最新的稳定版本是 PHP 8.3,而 PHP 8.4 预计在 2024年11月发布。您可能在谈论 PHP 8.1 或更高版本,因为这些版本已经支持 JIT。
JIT 开启方法(PHP 8.0+ 通用)
1. 检查当前 PHP 版本和 JIT 状态
首先确认您的 PHP 版本:
php -v
查看 JIT 是否已启用:
<?php
// 创建 info.php
phpinfo();
?>
或者在命令行中:
php -i | grep -i jit
php -i | grep -i opcache.jit
2. 编辑 php.ini 配置文件
找到您的 php.ini 文件:
# Windows
php --ini
# Linux/Mac
php --ini
添加或修改以下配置:
[opcache]
; 启用 opcache
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
; JIT 配置
opcache.jit_buffer_size=100M
opcache.jit=1255
; 或者使用更简单的配置
; opcache.jit=tracing
; opcache.jit=function
3. JIT 配置选项详解
opcache.jit 值的含义(4位数字):
tracing: 1255
function: 1205
各数字含义:
- 第1位:CPU特定优化标志
- 0:禁用
- 1:启用
- 第2位:JIT触发器
- 0:PHP脚本加载时
- 1:第一个请求时
- 2:在第一个请求时,但仅在热点代码上
- 3:运行时,基于分析
- 4:运行时,基于分析,带有保护
- 5:运行时,基于分析,带有保护,但仅在热点代码上
- 第3位:寄存器分配策略
- 0:不执行寄存器分配
- 5:优化寄存器分配
- 第4位:优化级别
- 0:不优化
- 1:最小优化
- 2:进一步优化
- 3:进一步优化
- 4:进一步优化
- 5:最大优化
推荐配置:
; 最常用的配置
opcache.jit=1255 ; 跟踪模式,最高优化
; 或
opcache.jit=tracing
4. 不同 PHP 版本的 JIT 配置
PHP 8.0+ 通用配置:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=256M
opcache.jit=tracing
PHP 8.1+ 增强配置:
opcache.preload= ; 可选,预加载
opcache.file_cache=/tmp/opcache
opcache.jit=function,1205
PHP 8.3+ 高级配置:
opcache.jit=1235
opcache.jit_hot_loop=64
opcache.jit_hot_func=127
opcache.jit_hot_return=8
opcache.jit_hot_side_exit=8
5. 验证 JIT 是否启用
创建测试脚本:
<?php
// test_jit.php
$enabled = ini_get('opcache.jit_buffer_size') && ini_get('opcache.jit');
echo "JIT 状态: " . ($enabled ? "已启用" : "未启用") . "\n";
if ($enabled) {
echo "JIT Buffer Size: " . ini_get('opcache.jit_buffer_size') . "\n";
echo "JIT 模式: " . ini_get('opcache.jit') . "\n";
// 测试性能
$start = microtime(true);
$sum = 0;
for ($i = 0; $i < 10000000; $i++) {
$sum += $i;
}
$end = microtime(true);
echo "JIT 测试耗时: " . ($end - $start) . " 秒\n";
}
?>
6. 针对不同环境的优化配置
开发环境:
opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size=100M
opcache.jit=function
opcache.validate_timestamps=1
生产环境:
opcache.enable=1
opcache.enable_cli=0
opcache.jit_buffer_size=256M
opcache.jit=tracing
opcache.validate_timestamps=0
opcache.save_comments=0
CLI 模式:
opcache.enable_cli=1
opcache.jit_buffer_size=50M
opcache.jit=1255
7. 常见问题解决
问题1:JIT 不生效
# 检查 opcache 状态
php -r "var_dump(function_exists('opcache_get_status') ? opcache_get_status()['jit'] : 'opcache not enabled');"
问题2:内存不足
; 减小 JIT 缓冲区大小
opcache.jit_buffer_size=50M
opcache.memory_consumption=128
问题3:Windows 特殊配置
; Windows 可能需要指定扩展路径
extension_dir = "C:\php\ext"
zend_extension=php_opcache.dll
opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=tracing
8. 性能测试对比
使用以下脚本测试 JIT 效果:
<?php
// benchmark_jit.php
function bench_loop($iterations = 10000000) {
$start = microtime(true);
$sum = 0;
for ($i = 0; $i < $iterations; $i++) {
$sum += sin($i) * cos($i);
}
$end = microtime(true);
return $end - $start;
}
echo "开始 JIT 性能测试...\n";
echo "JIT 配置: " . ini_get('opcache.jit') . "\n";
$time_without_jit = bench_loop(1000000);
echo "测试完成,耗时: " . $time_without_jit . " 秒\n";
// 多次运行获取平均值
$times = [];
for ($i = 0; $i < 5; $i++) {
$times[] = bench_loop(1000000);
}
echo "平均耗时: " . (array_sum($times) / count($times)) . " 秒\n";
?>
9. 最佳实践建议
- 内存分配:
- 小型项目:50-100M
- 中型项目:100-256M
- 大型项目:256-512M
- JIT 模式选择:
- CPU 密集型应用:
tracing模式 - 一般 Web 应用:
function模式 - CLI 脚本:
1255或1205
- CPU 密集型应用:
- 监控工具:
# 安装 opcache-gui
composer require amnuts/opcache-gui
# 或使用内置函数查看状态
php -r "print_r(opcache_get_status()['jit']);"
10. 注意事项
- 重启服务:修改 php.ini 后需要重启 PHP-FPM 或 Web 服务器
- 版本兼容:确保 opcache 扩展与 PHP 版本匹配
- 内存监控:监控服务器内存使用情况
- 预热:生产环境建议预热 JIT 缓存