本文约 3,114 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
用测速工具看首页,你会发现最关键的一项指标是 TTFB,也就是首字节时间——从浏览器发出请求到收到服务器第一个字节响应的间隔。它衡量的是「你的服务器要花多久才能吐出页面」,如果 TTFB 高达一两秒,那后面不管图片多小、脚本多精简,用户还是要盯着白屏等这么久。很多站长一听速度慢就拼命压缩图片、合并 JS,却对 TTFB 视而不见,等于在地基没打好的房子上刷墙。TTFB 高的核心在服务器端:PHP 每次都要重新编译脚本,WordPress 每次都要反复查询数据库里的选项和内容。针对这两点,OPcache 负责加速 PHP 执行,对象缓存负责加速数据库读取,两者配齐,TTFB 往往能从秒级降到几百毫秒甚至更低。
故障原因分析
- PHP 脚本每次重新编译。没有 OPcache 时,每个请求都要把 PHP 文件解析、编译成字节码再执行,纯属重复劳动。
- 数据库被高频重复查询。WordPress 每次加载都要读
wp_options、菜单、文章等数据,没有对象缓存时每次都连库查询,请求一多数据库就成了瓶颈。
- 没有页面缓存。动态生成的首页每次都要跑完整套 PHP 加数据库流程,TTFB 自然高。
- 服务器与访客距离远、网络绕路。源站单点部署,没有 CDN 或反向代理,跨区域访问延迟叠加。
- 数据库未优化、连接数不足。表碎片多、慢查询多,或 MySQL 最大连接数太小,请求排队等待也会抬高 TTFB。
分步解决方案
第一步:先测出真实 TTFB
用 PageSpeed Insights、GTmetrix,或在浏览器 F12 的 Network 面板看第一个请求的 Waiting(TTFB) 数值。也可以命令行测:
# 测量首页 TTFB,关注 time_starttransfer
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\n" https://www.example.com/
健康标准:TTFB 在 200 到 500 毫秒算不错,超过 800 毫秒就该优化。测的时候多测几次取稳定值,排除网络抖动。
第二步:开启并调优 OPcache
OPcache 把编译好的字节码缓存在内存,后续请求直接执行,省下编译开销。宝塔面板进入「软件商店 → PHP → 设置 → 配置修改」或直接改 php.ini:
; php.ini
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
memory_consumption 是缓存可用内存,大站可设 256 或 512;max_accelerated_files 要设得比站点 PHP 文件总数大,WordPress 加插件通常上万,设 20000 较稳。改完重启 PHP-FPM 生效。可以在 WordPress 后台装「OPcache Status」类插件查看命中率,命中率接近 100% 说明效果良好。
第三步:配置 Redis 对象缓存
对象缓存把频繁读取的数据库查询结果存到内存,下次同查询直接命中内存,不再打数据库。推荐 Redis。先在服务器安装 Redis 服务(宝塔在软件商店一键安装),并安装 PHP 的 Redis 扩展(同样在 PHP 设置里勾选安装)。然后在 WordPress 安装「Redis Object Cache」插件,进入其设置页点「Enable Object Cache」。它会自动在 wp-content 写入 object-cache.php 文件。
如果连接参数需要自定义,在 wp-config.php 里加:
// wp-config.php
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_REDIS_PREFIX', 'mysite:' );
define( 'WP_REDIS_MAXTTL', 86400 );
启用成功后在插件页会显示「Status: Connected」以及命中率。也可以用 Redis 命令行确认:
redis-cli info stats | grep keyspace_hits
第四步:叠加页面缓存
对象缓存解决了数据库重复查询,但 PHP 仍在执行。再上一层页面缓存(WP Rocket、LiteSpeed Cache),让静态 HTML 直接返回,TTFB 能进一步降到几十毫秒。注意页面缓存和对象缓存是互补的,不冲突,两者都开效果最好。
第五步:优化数据库和服务器参数
用 WP-Optimize 清理臃肿数据并优化表,减少慢查询。检查 MySQL 配置,适当调大连接数(max_connections)和 InnoDB 缓冲池(innodb_buffer_pool_size,一般设为可用内存的 50% 到 70%)。用 Query Monitor 找出执行时间最长的查询,针对性优化或禁用产生它的插件。
第六步:用 CDN 减少网络延迟
源站 TTFB 降下来后,再用 CDN 把静态资源分发到就近节点,访客连的是离他最近的节点,网络往返时间缩短,整体响应更快。国内站点用国内节点 CDN,效果比国外免费 CDN 更好。
第七步:复测确认
优化完再测一次 TTFB,对比前后数值。正常情况下,开了 OPcache 加 Redis 加页面缓存,首页 TTFB 从一秒多降到二三百毫秒是常见结果。用 Query Monitor 确认数据库查询次数明显下降。
常见踩坑点
- OPcache 开了但
validate_timestamps=0又忘了手动清。关掉时间戳校验后改了代码不会自动生效,必须重启 PHP 或手动清 OPcache,调试期建议设为 1。
max_accelerated_files设太小。文件数超过上限后缓存频繁换出,命中率暴跌,效果还不如不开,要设得足够大。
- Redis 密码或端口写错导致连不上。插件显示未连接却以为已开启,务必在插件页看到 Connected 才算成功。
- 对象缓存和页面缓存对新发布内容的影响。上缓存后要记得清理,避免内容延迟显示,尤其是页面缓存。
- 只加缓存不查根因。如果某个插件写了一条超慢查询,对象缓存只能缓解不能根治,仍要用 Query Monitor 找出并处理慢查询。
总结
首页 TTFB 过高,说明瓶颈在服务器响应这一层,光优化前端资源没法解决。正确的打法是分两步:用 OPcache 把 PHP 脚本编译结果缓存在内存,消除重复编译开销;再用 Redis 对象缓存把高频数据库查询结果放进内存,同时叠加页面缓存让静态 HTML 直接返回。配合数据库清理、MySQL 参数调优和 CDN 分流,首页 TTFB 通常能从秒级压到几百毫秒以内,用户打开页面几乎瞬间就有反应。优化完务必用工具复测并检查缓存命中率,确认每一层都真正生效,而不是开了插件却没连上。盯住 TTFB 这个指标,你的速度优化才算打到了根子上。
