WordPress是全球使用量最大的建站程序,功能强大、插件丰富,但也常被吐槽"慢"。慢的原因其实很明确:每个页面都要动态执行PHP、查询数据库,还要加载一堆脚本和样式,如果插件再装得多一点,一次页面请求背后可能藏着几十次数据库查询。不过只要按照正确顺序做几件事,WordPress完全可以跑得飞快。本文按"先测量、再缓存、后瘦身"的思路,给出一套适合个人站长的完整提速方案。
一、动手之前先测量,别瞎优化
优化的第一步不是改配置,而是搞清楚网站到底慢在哪里。先在浏览器开发者工具的Network面板里看两个数字:一是TTFB,也就是从发出请求到收到第一个字节的时间,这个数字大说明问题出在服务器端,可能是PHP执行慢、数据库查询慢;二是页面总大小和请求数量,图片、脚本、字体是不是太多了。再装一个Query Monitor插件,它会在后台显示每次页面加载执行了多少次数据库查询、哪些查询慢、哪个插件和钩子耗时最长,是定位WordPress性能问题最趁手的工具。测量出瓶颈之后,再按下面的顺序对症下药,效果会好得多。
二、第一板斧:页面缓存,把动态变静态
WordPress慢的根源是"每次访问都要现算",所以最有效的优化就是让页面不用现算——把生成好的HTML缓存起来,访客再来时直接拿缓存文件。页面缓存的实现方式分两类。
一类是插件方案,适合虚拟主机用户。老牌的WP Super Cache会把页面生成静态HTML文件,之后的访问直接由服务器返回静态文件,配置简单;W3 Total Cache功能更全,除了页面缓存还带数据库缓存、对象缓存、浏览器缓存,但配置项多、容易调错,新手容易踩坑;如果服务器用的是LiteSpeed,直接装LiteSpeed Cache插件,效率和配置体验都很好。插件方案里有两个要点:一是登录用户、购物车这类动态页面必须排除在缓存之外,否则会出现"登录了还看到别人缓存的内容"这类诡异问题;二是设置合理的缓存过期时间,内容更新频繁的站设短一些,比如十分钟,内容稳定的站可以设一小时以上。
另一类是服务器级缓存,适合自己管VPS的站长,性能最好。以Nginx为例,可以用fastcgi_cache把PHP处理结果缓存到内存或磁盘,配置思路如下:
fastcgi_cache_path /var/cache/nginx/wpcache levels=1:2 keys_zone=WPCACHE:100m inactive=60m max_size=1g;
server {
# ... 站点常规配置 ...
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache WPCACHE;
fastcgi_cache_key $scheme$request_method$host$request_uri;
set $skip_cache 0;
if ($request_uri ~* "/wp-admin/|/wp-json/|xmlrpc.php|wp-cron.php") { set $skip_cache 1; }
if ($http_cookie ~* "wordpress_logged_in|wp-postpass|comment_author") { set $skip_cache 1; }
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_valid 200 301 302 10m;
add_header X-Cache-Status $upstream_cache_status;
}
}上面的配置把后台、登录态、评论者这些动态请求排除在缓存外,其余页面缓存十分钟。加上的X-Cache-Status响应头可以帮你确认缓存是否生效:看到HIT就是命中缓存,MISS就是没命中。服务器级缓存比插件快得多,因为请求根本到不了PHP,代价是需要懂一点Nginx配置,出了问题也要自己排查。个人建议:有VPS就上服务器级缓存,只有虚拟主机就用插件。
三、第二板斧:对象缓存,给数据库减负
页面缓存解决的是"重复计算"的问题,但后台操作、登录用户看到的页面、最近的评论这些动态场景,还是会反复查询数据库。这时候需要对象缓存:把数据库查询结果存在内存里,下次直接取。WordPress最常用的对象缓存后端是Redis,做法分两步:先在服务器上安装Redis服务,再安装Redis Object Cache插件,插件会自动创建object-cache.php这个文件,把WordPress的缓存接口接到Redis上。也可以在wp-config.php里直接指定连接参数:
define('WP_REDIS_HOST', '127.0.0.1');define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
启用对象缓存后,很多站点的数据库查询次数会从每次三四十次降到个位数,数据库压力明显下降,动态页面的响应速度也能快不少。装了之后可以在Query Monitor里对比开关前后的查询次数,你会直观地看到差距。
四、第三板斧:数据库瘦身,清掉历史包袱
WordPress默认会把文章的每次修改都存成修订版本,一篇改了二十次的文章在数据库里就有二十份草稿,再加上垃圾评论、回收站、过期的瞬态数据,数据库里充满了没用的记录,越积越大,查询自然越来越慢。瘦身可以从两个层面做。
第一层是源头控制,在wp-config.php里限制修订版本数量和自动保存频率:
define('WP_POST_REVISIONS', 3);
define('AUTOSAVE_INTERVAL', 300);第二层是清理存量。可以用WP-Optimize这类插件一键清理,也可以直接执行SQL,比如清掉所有过期的瞬态数据:
DELETE FROM wp_options WHERE option_name LIKE '_transient_%'
OR option_name LIKE '_site_transient_%';清理前记得先备份数据库。另外,如果网站运行多年且表还是MyISAM引擎,建议把文章、评论这几张主要表转成InnoDB,并发读写能力更强;数据库瘦身这件事,建议每三个月做一次,作为固定运维项目。
五、图片与静态资源,压掉看得见的体积
图片往往是页面体积的最大贡献者。WordPress从5.5版本开始默认给图片加懒加载,这个不用额外操心;需要操心的是上传前压缩:一张手机拍的几MB照片直接传上去,再好的缓存也救不了加载速度。建议上传前先用工具压到一两百KB,需要WebP格式的话可以用插件在服务器端转换,或者交给图床/CDN处理。另外,把主题自带的那些用不上的脚本和样式精简掉,移除WordPress默认加载的表情符号脚本也能省掉两个请求:
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');这段代码加到主题的functions.php里即可。字体也建议本地化,很多主题默认从Google Fonts加载字体,国内访问很慢,把字体文件下载到本地或者换成国内CDN源,页面首屏速度会有肉眼可见的提升。
六、主题与插件纪律:少而精
WordPress变慢的头号原因其实是插件装太多。每个插件都会在页面加载时执行自己的代码,插件之间还可能互相冲突。建议遵守三条纪律:第一,只装真正需要的插件,功能重复的坚决只留一个;第二,用Query Monitor看看每次页面加载时各个插件和钩子的耗时,把拖后腿的插件找出来,如果某个插件贡献了大部分耗时,考虑换一个轻量的替代品;第三,主题和插件保持更新,老版本不光有安全漏洞,性能也往往不如新版本。还要提醒一句,不要同时装好几个"优化插件",它们功能重叠、互相打架,反而会让网站更慢。
七、WordPress 特有的两个隐藏拖累
除了缓存和瘦身,还有两个WordPress特有的机制值得处理。一是伪cron机制,WordPress默认在访客访问页面时触发定时任务,流量大的站点这会让部分访客请求变慢,解决方法是禁用伪cron,改用系统真实定时任务:
// wp-config.php
define('DISABLE_WP_CRON', true);然后在服务器crontab里加一条,每五分钟触发一次真正的定时任务:
/5 * curl -s https://www.example.com/wp-cron.php?doing_wp_cron > /dev/null二是后台的Heartbeat心跳接口,它默认每十五秒轮询一次,开着后台页面就会持续产生请求,可以在functions.php里把轮询间隔调大或者只在编辑页面启用:
add_filter('heartbeat_settings', function ($settings) {$settings['interval'] = 60;
return $settings;
});
这两处改动对前台访客没有影响,但能明显降低服务器负载和后台操作的延迟感。
八、收尾:服务器与CDN
上面的优化都做完后,如果还觉得不够快,剩下的工作就在服务器层面了:把PHP升级到8.1以上并开启OPcache扩展,PHP版本越新执行效率越高;给PHP-FPM和MySQL做基本的内存参数配置;CSS、JS这些静态资源可以交给CDN分发。这些内容每一块展开都是一篇长文,这里不重复展开,按"先程序内、后服务器"的顺序做,通常程序内的三板斧就能解决九成以上的速度问题。
最后总结一下这套方案的核心顺序:先测量找到真瓶颈,再上页面缓存消灭重复计算,接着用对象缓存和数据库瘦身给数据库减负,最后压缩图片、精简插件、处理好cron和心跳。按这个顺序走下来,一台普通配置的VPS也能把WordPress跑得又快又稳,而不是急着加钱升级服务器——多数时候,网站慢并不是硬件不够,而是没优化到位。
九、常见问题
问:页面缓存会不会导致文章更新后不生效?答:会的,所以发布或修改文章后要记得清理缓存,插件方案一般会自动清理相关页面,服务器级缓存可以手动清空缓存目录,或者把过期时间设短一些。
问:Redis缓存和页面缓存冲突吗?答:不冲突,两者分工不同,页面缓存管最终HTML,对象缓存管数据库查询结果,可以同时启用。
问:用CDN之后还需要页面缓存吗?答:需要,CDN缓存的是边缘节点的文件,回源时如果源站没有页面缓存,每个CDN节点第一次访问还是会打到PHP上,两层配合效果最好。