去年我把公司一个老项目从PHP7.4升级到PHP8.1,顺手开了JIT,结果线上接口响应时间反而涨了5%。排查半天发现是JIT配置不当,还踩了opcache.file_cache的坑。今天不扯理论,直接上实测数据,告诉你JIT到底该不该开、怎么开。
我们对比三种场景:
测试环境:Ubuntu 22.04, PHP 8.2.10 (cli), Intel i7-12700, 32GB RAM, SSD。所有测试执行5次取中位数。
# 安装PHP8.2(以Ubuntu为例)
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2-cli php8.2-common php8.2-opcache -y
# 查看PHP版本
php -v
# 输出:PHP 8.2.10 (cli) (built: Sep 12 2023 12:00:00) ( NTS )
# 编辑php.ini
sudo vim /etc/php/8.2/cli/php.ini
关键配置项(方案B):
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.jit=tracing
opcache.jit_buffer_size=100M
方案C改为:
opcache.jit=function
opcache.jit_buffer_size=64M
重启PHP-FPM或CLI后生效:sudo systemctl restart php8.2-fpm(如果使用FPM)。
我们写两个典型场景:CPU密集型(计算斐波那契)和I/O密集型(模拟文件读取)。
运行:php benchmark.php。注意:每次测试前清空OPcache缓存:php -r 'opcache_reset();'。
使用Laravel 10.28 + PHP8.2,模拟一个带数据库查询的API:
// routes/api.php
Route::get('/users', function () {
return \App\Models\User::select('id', 'name', 'email')
->where('status', 1)
->orderBy('id')
->take(100)
->get();
});
压测命令(使用wrk2):
# 安装wrk2
sudo apt install build-essential libssl-dev git -y
git clone https://github.com/giltene/wrk2.git
cd wrk2 && make
sudo cp wrk /usr/local/bin/
# 压测:100个连接,持续30秒
wrk -t4 -c100 -d30s --latency http://localhost:8000/api/users
| 测试项 | 方案A(无JIT) | 方案B(tracing) | 方案C(function) |
|---|---|---|---|
| fib(35) 耗时 | 2.341s | 0.892s | 0.915s |
| IO任务1000次 | 0.123s | 0.118s | 0.121s |
| Laravel API RPS | 1850 req/s | 1920 req/s | 1900 req/s |
| Laravel API p99延迟 | 12ms | 11ms | 11ms |
结论:
opcache.file_cache和JIT,可能导致缓存文件损坏。建议关闭file_cache或设置opcache.file_cache_only=0。php -d opcache.jit=function script.php预热,或使用OPcache预加载。php -i | grep jit确认状态。一句话:JIT是锦上添花,不是雪中送炭。先优化架构和SQL,再考虑JIT。
专注技术分享与实战