站点打开要五六秒,一直以为是服务器太差。

后来一步步测下来,发现和服务器配置关系不大,问题全在代码里。

这篇讲怎么定位"慢在哪一段",比盲目升级配置有用得多。

先测分段耗时

不要只看总时间。用 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、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。