上周帮朋友优化了一个 WordPress 站,首页加载从 2.8 秒干到 0.6 秒。其实没做什么特别的事,就是几个常规优化步骤。记录一下。
先测一下现在的速度
优化之前先有个基准,不然不知道改了之后有没有效果。
几个常用的基准测试工具:
| 工具 | 用途 | 推荐度 |
|---|---|---|
| wrk | HTTP 压力测试,测吞吐量 | ⭐⭐⭐⭐⭐ |
| ab(ApacheBench) | 简单的并发测试 | ⭐⭐⭐ |
| k6 | 可编程的压力测试 | ⭐⭐⭐⭐ |
| Blackfire.io | PHP 性能分析,定位慢代码 | ⭐⭐⭐⭐⭐ |
| Xdebug + Webgrind | 本地开发时的性能分析 | ⭐⭐⭐⭐ |
先跑个 wrk 看看基准:
# 安装 wrk
apt install wrk -y
# 测试:12 线程,400 并发,持续 30 秒
wrk -t12 -c400 -d30s http://你的域名/我朋友那个站优化前的数据:
Running 30s test @ http://xuyunblog.com/
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 850ms 120ms 1.2s 85%
Req/Sec 38.5 12.3 62.0 78%
13,862 requests in 30.05s每秒处理 38.5 个请求,平均延迟 850ms。对于一个博客来说确实不太行。
第一步:开启 OPcache(立竿见影)
OPcache 是 PHP 自带的字节码缓存。没开的话,每次请求 PHP 都要重新编译代码,浪费大量时间。
确认有没有开
php -i | grep "opcache.enable"
# 输出 opcache.enable => On => On 就是开了大多数宝塔面板默认会开,但配置不一定最优。
推荐配置
编辑 php.ini(宝塔面板:软件商店 → PHP → 设置 → 配置文件):
[opcache]
opcache.enable=1
opcache.memory_consumption=256 ; 默认 128,调到 256
opcache.interned_strings_buffer=32 ; 默认 8,调到 32
opcache.max_accelerated_files=20000 ; 默认 10000,调到 20000
opcache.validate_timestamps=0 ; 生产环境设为 0,更新代码后手动刷新
opcache.fast_shutdown=1
opcache.enable_cli=1效果(实测):
| 配置状态 | Req/Sec | 平均延迟 |
|---|---|---|
| 没开 OPcache | 22 | 1.1s |
| 默认配置 OPcache | 45 | 650ms |
| 优化配置 OPcache | 62 | 420ms |
只改了这个配置,每秒请求数就从 22 翻倍到 62。
第二步:升级 PHP 版本(白嫖性能)
PHP 8.x 相比 7.x 性能提升明显,8.4 又有改进。
| PHP 版本 | 基准测试(相对值) | JIT 支持 | 状态(2026) |
|---|---|---|---|
| 7.4 | 100% | 无 | 已停止维护 |
| 8.0 | ~105% | 有 | 已停止维护 |
| 8.1 | ~110% | 有 | 安全维护 |
| 8.2 | ~115% | 有 | 活跃维护 |
| 8.3 | ~120% | 改进 | 活跃维护 |
| 8.4 | ~125% | 改进 | 最新稳定版 |
从 7.4 升到 8.4,同等条件下性能提升 25%。而且升级操作很简单——宝塔面板里选个新版本,点保存,等一两分钟就切换了。
升级前注意:先确认你的程序和插件兼容新版 PHP。不兼容的可以先在测试环境跑。
第三步:数据库优化
数据库慢是 PHP 网站最常见的瓶颈。
慢查询日志
先打开慢查询日志,看看哪些 SQL 语句在拖后腿:
# my.cnf / mariadb.conf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 ; 超过 1 秒的才记录跑一段时间然后看日志:
cat /var/log/mysql/slow.log | grep "SELECT" | head -20给常用字段加索引
最常见的问题——没加索引导致全表扫描。
-- 看看哪些表缺少索引
SELECT table_schema, table_name, index_length
FROM information_schema.statistics
WHERE table_schema = 'wordpress'
ORDER BY index_length DESC;
-- 给常用的查询字段加索引
ALTER TABLE wp_posts ADD INDEX idx_post_status (post_status, post_date);
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key (meta_key);加个 Redis 缓存
WordPress + Redis 缓存的组合现在非常成熟了。
# 安装 Redis
apt install redis-server -y
# 安装 PHP Redis 扩展(宝塔面板:软件商店 → PHP → 安装扩展 → redis)
# WordPress 装 Redis Object Cache 插件Redis 开启后的效果(同一个 WordPress 站):
| 优化阶段 | Req/Sec | 平均延迟 | 数据库查询/页面 |
|---|---|---|---|
| 原始状态 | 22 | 1.1s | 45-60 次 |
| + OPcache | 62 | 420ms | 45-60 次 |
| + PHP 8.4 | 78 | 340ms | 45-60 次 |
| + Redis 缓存 | 156 | 165ms | 8-15 次 |
| + 页面缓存 | 320 | 75ms | 0-2 次 |
第四步:页面级缓存
PHP 最大的性能消耗是每次请求都要查数据库、跑模板。页面缓存直接把最终 HTML 存下来,后续请求直接返回 HTML。
方案对比
| 缓存方案 | 适合场景 | 效果 | 复杂度 |
|---|---|---|---|
| WordPress 缓存插件(WP Super Cache / LiteSpeed Cache) | WordPress 站 | 效果极好 | 低 |
| Nginx FastCGI Cache | 任何 PHP 项目 | 效果极好 | 中 |
| Varnish | 多站点、复杂场景 | 效果最好 | 高 |
| Cloudflare 边缘缓存 | 静态+缓存页面 | 全球加速 | 低 |
Nginx FastCGI Cache 配置示例:
# 在 http 块中定义缓存区域
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=MYAPP:10m max_size=1g inactive=60m;
server {
# ... 其他配置
location ~ \.php$ {
fastcgi_cache MYAPP;
fastcgi_cache_valid 200 30m; # 200 状态码缓存 30 分钟
fastcgi_cache_valid 404 1m;
fastcgi_cache_use_stale error timeout;
add_header X-Cache $upstream_cache_status; # 方便调试
}
}调试的时候看响应头里的 X-Cache 字段:
HIT:命中缓存 ✅MISS:未命中,回源 PHP ❌BYPASS:绕过缓存(登录用户等) ℹ️
第五步:其他优化项
启用 Gzip / Brotli 压缩
# Gzip
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
gzip_min_length 1000;
# Brotli(比 Gzip 压缩率更高)
# 需要先安装 ngx_brotli 模块
brotli on;
brotli_comp_level 6;
brotli_types text/css application/javascript application/json image/svg+xml;图片优化
- 用 WebP 格式(比 JPEG 小 30%+)
- WordPress 装 Imagify 或 ShortPixel 自动转换
- 懒加载(
loading="lazy")
调整 PHP-FPM 进程数
# php-fpm.conf
pm = dynamic
pm.max_children = 50 ; 根据内存调整,每个进程约 50-80MB
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 20
pm.max_requests = 500 ; 防内存泄漏算一下:2G 内存的服务器,PHP-FPM 大概能跑 2048 / 70 ≈ 29 个进程。设 20-25 比较安全。
优化效果汇总
跑完上面所有步骤,我朋友那个站的数据:
Running 30s test @ http://xuyunblog.com/
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 75ms 25ms 180ms 82%
Req/Sec 320.5 45.2 410.0 79%
115,380 requests in 30.02s从 38 Req/s 到 320 Req/s,提升了 8.3 倍。
首页加载时间从 2.8s 降到 0.3s 左右。
常见问题
OPcache 设了 validate_timestamps=0,更新代码后怎么办?
# 重载 PHP-FPM 就刷新 OPcache 了
systemctl reload php8.4-fpm或者在 WordPress 里装个插件,后台点一下就能刷新。
缓存导致内容不更新?
清除缓存就行。Nginx:删 /var/cache/nginx/ 下的文件。WordPress:缓存插件里点「清除全部缓存」。
优化后内存不够用了?
减少 PHP-FPM 的 pm.max_children,或者关掉一些不必要的服务。Redis 也可以限制内存:redis-cli CONFIG SET maxmemory 256mb。
叙云博客后续还会分享更多实战优化案例。有具体的性能问题欢迎留言。

暂无评论内容