看完这篇,你能拿到一条从「零成本配置」到「改架构」的 PHP 提速路线图,知道每一步该改哪个参数、怎么验证、什么时候该停手。
第一步:先量瓶颈,别凭感觉优化
优化之前必须先有数字。最省事的办法是压测当前首页:
ab -n 1000 -c 20 https://你的域名/
# 或
wrk -t4 -c50 -d30s https://你的域名/
重点看两个数:QPS 和 平均响应时间。同时在服务器上 `top` 看是 CPU 跑满还是 iowait 高——CPU 高说明是计算问题(OPcache/JIT 有用),iowait 高说明是数据库或磁盘问题(OPcache 基本没用)。
注意:不要在生产站点上直接跑压测,先切一台同配置的测试机,或者至少压测静态页而不是登录后的动态页。
第二步:OPcache——几乎零成本的 2~5 倍
PHP 默认每次请求都要把 `.php` 重新编译成 opcode,OPcache 就是把这步结果缓存起来。
宝塔面板路径:软件商店 → PHP-8.x → 设置 → 性能调整,或者直接改 `php.ini`:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
`max_accelerated_files` 要大于你项目里的 PHP 文件数,先数一下:
find /www/wwwroot/你的站点 -name "*.php" | wc -l
生产环境可以把 `validate_timestamps=0`,性能再高一截。
注意:设成 0 之后,改了 PHP 文件不会自动生效,每次更新代码都要重载 PHP:宝塔上点「重载配置」,命令是 `systemctl reload php-fpm`。忘了这步会以为代码没上传成功。
第三步:JIT——先别急着开
PHP 8.0 引入的 JIT 把 opcode 直接编译成机器码,听起来很美,但它对读数据库、写文件、调接口为主的 Web 应用提升通常在 5% 以内,某些场景反而更慢。参数:
opcache.jit=tracing
opcache.jit_buffer_size=64M
正确做法是开着压测对比,涨了就留,没涨就关。CPU 没跑满之前,JIT 不是你的瓶颈。
第四步:干掉重复查询和重复计算(比 JIT 值钱得多)
这一步的收益往往比前两步加起来都大:
- 开 MySQL 慢查询日志,把超过 0.5 秒的 SQL 捞出来,`EXPLAIN` 看有没有走索引;
- 高频读取的结果做缓存。没有 Redis 就用文件缓存,别硬上;
- 把「每次请求都重新算一遍」的东西缓存起来,比如首页统计、排行、版块列表。像 Clara BBS 这类系统自带的 `Cache::remember` 就是干这个的,写插件时优先用它而不是裸查数据库;
- 静态化:Nginx 的 `fastcgi_cache` 或直接把不变页面生成为 HTML。
注意:缓存一定要设过期时间和主动失效开关。改完内容看不到变化、以为是「保存不生效」,九成是缓存没清。
第五步:常驻内存——Swoole / Workerman / RoadRunner
前面几步都在优化「单次请求」,而常驻内存是把框架启动、配置加载、路由注册这些每请求做一次的事,改成进程启动时只做一次。常见选择:
- Swoole:`pecl install swoole`,`php --ri swoole` 验证装上了,配合 Hyperf 或 Laravel Octane 使用;
- Workerman:纯 PHP 实现,不需要装扩展,上手更简单;
- RoadRunner / FrankenPHP:Go/Caddy 做进程管理器,PHP 侧改动小。
代价也要说清楚:全局变量和静态变量会在请求之间残留,得手动清理;内存泄漏会累积;连接池、协程上下文都得重写;`exit`、`header()` 这类函数行为也变了。
注意:不是所有项目都该上这套。像 Clara BBS 这种无框架轻量系统——运行时钩子加载、保存即生效、无需 Composer 和命令行——跑在 PHP-FPM 上已经足够快,硬套 Swoole 要把所有钩子加载逻辑和全局状态重做一遍,投入产出比很低。只有当 QPS 确实卡在 FPM 上限时才值得动。
第六步:回头确认不是机器和前端的问题
- php-fpm 进程数:`pm.max_children` 约等于「可用内存 ÷ 单进程内存」,设太小请求排队,设太大触发 OOM;
- 静态资源上 CDN,开 gzip/brotli 和 HTTP/2;
- 图片压缩后再上传,这是很多站点首屏慢的真正原因。
小结
- 先压测拿到 QPS 和响应时间,再决定优化方向,别凭感觉;
- OPcache 是投入产出比最高的一步,生产环境记得 `validate_timestamps=0` 后要重载 PHP;
- JIT 只对 CPU 密集型有效,必须压测对比后再决定;
- 慢查询和重复计算通常比 JIT 更值得花时间,缓存要配过期与失效;
- Swoole 等常驻内存是「改架构」级别的手段,轻量无框架系统通常没必要上;
- 最后别忘了 php-fpm 进程数、CDN 和图片这些看起来「不高级」但影响很大的环节。