站点打开要五六秒,一直以为是服务器太差。
后来一步步测下来,发现和服务器配置关系不大,问题全在代码里。
这篇讲怎么定位"慢在哪一段",比盲目升级配置有用得多。
先测分段耗时
不要只看总时间。用 curl 把每个阶段拆开:
curl -o /dev/null -s -w "
DNS解析: %{time_namelookup}s
TCP连接: %{time_connect}s
TLS握手: %{time_appconnect}s
首字节: %{time_starttransfer}s
总耗时: %{time_total}s
" https://www.example.com/
这几个数字分别代表什么:
time_namelookup大 → DNS 慢,换个解析服务商time_connect减time_namelookup大 → 网络延迟或者机房远time_appconnect减time_connect大 → TLS 握手慢,证书链太长或者没开 session 复用time_starttransfer减time_appconnect大 → 服务器处理慢,这是关键的一段
我测出来:首字节 3.2 秒,TLS 之后的处理占了 2.8 秒。
说明网络没问题,全卡在 PHP 上。
确认是 PHP 还是数据库
在站点根目录丢一个 test.php:
<?php
$t1 = microtime(true);
$pdo = new PDO('mysql:host=localhost;dbname=数据库名', '用户', '密码');
$t2 = microtime(true);
$pdo->query("SELECT 1");
$t3 = microtime(true);
echo "连接耗时: " . round(($t2-$t1)*1000) . " ms\n";
echo "查询耗时: " . round(($t3-$t2)*1000) . " ms\n";
echo "PHP版本: " . PHP_VERSION;
如果连接就花了几百毫秒,问题在数据库连接,多半是 localhost 解析成了 IPv6 或者用了 TCP 而不是 socket。
把 host=localhost 改成 host=127.0.0.1,或者用 unix socket 路径,能快不少。
如果连接和查询都很快,但 WordPress 页面还是慢,那就是 WordPress 自己的问题。
WordPress 慢在哪
装个 Query Monitor 插件,它会告诉你每个页面执行了多少条 SQL、每条耗时多久、哪个插件触发的。
我打开首页,显示:247 条查询,3.1 秒。
正常应该在 30 条以内、200ms 以内。
按插件分组看,一个"热门文章统计"插件单独占了 180 条查询——它每次都要对 wp_postmeta 做一次全表扫描。
停用之后,查询降到 62 条,首字节从 3.2 秒降到 1.1 秒。
剩下的 1.1 秒怎么降
一、开 OPcache。
PHP 每次执行都要把源码编译成 opcode,OPcache 把编译结果缓存起来。开了之后一般能省 30% 左右。
; php.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
validate_timestamps=1 是开发环境用的,每次请求都检查文件有没有改动。生产环境可以设成 0,性能更好,但改了代码必须重启 PHP-FPM 才生效。
二、对象缓存。
WordPress 每次请求都要查一堆 option。装个 Redis 对象缓存,把这些查过的结果存内存里,第二次直接读内存。
宝塔软件商店里装 Redis,然后在 wp-config.php 里加:
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_CACHE', true);
再装 Redis Object Cache 插件,点一下启用。
我开了之后,查询数从 62 降到 18,首字节 0.4 秒。
三、图片和静态资源。
这些不影响首字节,但影响用户实际感觉。nginx 里给静态资源加缓存头:
location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
图片本身用 WebP,能小一半以上。
一个反直觉的点
我一开始想的是"升级服务器配置"。从 2C4G 升到 4C8G,一个月多花两百多。
升完之后,首字节从 3.2 秒降到 2.9 秒。基本没变。
因为瓶颈是"单个请求要执行 247 条查询",加 CPU 只是让这 247 条跑得快一点点,不是让它变少。
后来把那个插件停掉,同样的 2C4G,首字节 0.4 秒。
网站慢,九成不是配置不够,是代码在浪费。先找出谁在浪费时间,再决定要不要花钱。
优化后的数字
首页首字节:3.2 秒 → 0.4 秒
SQL 查询数:247 → 18
页面总加载:5.8 秒 → 1.3 秒(本地网络)
代价:装了 Redis,多占 100M 内存。换个插件,省了两百多的月费。
这买卖划算。
1、本站所有资源均收集于互联网,分享目的仅限学习与参考。如有侵权,请联系 1685698671@qq.com 及时删除!
2、本站资源不保证完整性和安全性,下载后请自行检测。使用过程中出现的任何问题均与本站无关,敬请自行处理。
3、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。


评论(0)