📖 本文共 1,540 字,阅读需要 6 分钟
一、三层缓存,现状
1) 页面缓存:WP Super Cache 3.1.3 —— 启用中
配置文件 wp-content/wp-cache-config.php:
| 设置 | 当前值 | 含义 |
|---|---|---|
$cache_enabled |
true |
插件总开关开 |
$super_cache_enabled |
true |
静态缓存开关开 |
WP_CACHE / drop-in |
true / advanced-cache.php 在位 |
缓存机制确实被加载 |
$cache_max_time |
3600 |
缓存 1 小时即过期(最关键的一项) |
$wp_cache_mod_rewrite |
0 |
Simple(PHP 交付),不走 nginx rewrite |
$cache_compression |
1 |
缓存文件 gzip 存储 |
$cache_path |
wp-content/cache/ |
实际落在 cache/supercache/<域名>/<URL 路径>/ |
$wp_cache_not_logged_in |
2 |
登录用户完全不走缓存(所以你后台浏览感受不到) |
$cache_rejected_user_agent |
array() |
不拒绝任何 UA(爬虫访问也照样缓存) |
$cache_rejected_uri |
wp-.*\.php、index\.php |
这两类 URI 不缓存 |
$wp_cache_clear_on_post_edit |
0 |
改文章不会清全站(好事) |
$wp_cache_mobile_enabled |
0 |
不做移动端变体 |
$wp_cache_preload_on |
0 |
预加载关闭 |
| 首页扩展检查 / 清空 | 全关 | — |
| 垃圾回收 | WP-Cron wp_cache_gc |
在跑(共 35 个 cron 事件,GC 排期正常,只删过期文件) |
2) 对象缓存:Redis —— 在跑
- 插件
redis-cache 3.0.0+ drop-inwp-content/object-cache.php(109KB,2025-09-21 更新) - 实测
redis-cli ping= PONG,dbsize= 4786 个键 → 确实在工作 - (
wp redis status读不到redis-cache选项,是 3.0 改了配置存储方式,不影响它工作)
3) PHP / Web 层
- PHP 8.1 + opcache 开启(128MB)
- nginx 对 css/js/图片下发 30 天 expires(所以改样式必须换版本号)
- 无 CDN(DNS 直连),nginx 也没开 fastcgi_cache
二、实际表现(今天实测,不是推测)
- 命中的真实形态:缓存文件是
wp-cache-<hash>.php+meta-wp-cache-<hash>.php(WP-Cache 引擎文件),缓存目录里 0 个静态index.html—— 虽然$super_cache_enabled=true,静态 supercache 实际没产出(这点还没查透) - 速度:冷渲染 544ms → 缓存命中 21ms(约 25 倍)
- 覆盖率很低:408 个页面里此刻只有约 40 个有缓存文件 → 因为 1 小时过期,只有”最近 1 小时被访问过”的页面在缓存里
- 首页没有缓存:目录里没有它的缓存文件,两次请求都是动态渲染(首屏 ~1s)
- 中文 URL 的坑:缓存目录用大写
%E5%AE%98...,而get_permalink()返回小写%e5%ae%98...,Linux 区分大小写 → 两套目录并存
三、一句话总结
当前 = 1 小时有效期的页面缓存 + Redis 对象缓存 + opcache。
命中时极快(~20ms),但覆盖靠”自然访问”:冷页面、首页、归档页都是动态渲染(0.5–1s),且过期后 1 小时就没了。这也解释了上一轮我说”预热只有 1 小时价值”的由来。
要让”全站预热”真正划算,关键就是三件事:把 $cache_max_time 放大(1 小时 → 1 天/7 天)、预热一次、定时预热维持。这正好是上次方案 A,你确认后我就执行。
本文章永久链接: WordPress缓存设置问题
