\_transient 记录堆积主因是过期机制失效:wp_cron 失效、未调用 delete_transient()、手动设 0 秒过期或绕过 set_transient() 直接 add_option 写入;安全清理应联查 timeout 键筛选真正过期项,优先用 wp transient delete --all(支持 --dry-run、--exclude 等),并溯源修复插件/主题的错误写法。
为什么 _transient 记录会堆积成山
wordpress 用 _transient 前缀的选项(option)存临时数据,比如 rss 解析结果、api 响应、插件生成的预计算值。它本该自动过期——但实际中常因“删除时机依赖钩子触发”而滞留:比如 wp_cron 失效、插件没调用 delete_transient()、或手动写入时漏设过期时间(set_transient( $key, $val, 0 ) 就是永不过期)。这些记录不会被前台请求清理,只在后台定时任务或显式调用时才检查过期,久而久之数据库里全是“僵尸 transient”。
直接删库前先确认哪些真过期了
别一上来就 DELETE FROM wp_options WHERE option_name LIKE '_transient_%'——这会把正在用的缓存也干掉,导致页面首次加载变慢甚至报错。正确做法是只清“已过期且无锁”的记录。WordPress 内部用 _transient_timeout_XXX 记录过期时间,对应 _transient_XXX 的值。要安全清理,得联查这两个键:
SELECT t.option_name
FROM wp_options t
JOIN wp_options tt ON tt.option_name = CONCAT('_transient_timeout_', SUBSTRING(t.option_name, 12))
WHERE t.option_name LIKE '_transient_%'
AND t.option_name NOT LIKE '_transient_timeout_%'
AND tt.option_value
<p>这个查询能筛出所有值存在、超时时间已到、且没被其他进程锁定(如 <code>_transient_doing_cron</code>)的记录。执行前建议先 <code>SELECT COUNT(*)</code> 看数量,万级以下可手动删;十万级以上就得分批。</p>
<h3>用 WP-CLI 批量清理最稳当</h3>
<p>比手写 SQL 更推荐 <code>wp transient delete --all</code>,它走的是 WordPress 原生逻辑:逐条检查 <code>_transient_timeout_*</code>,只删真正过期的,跳过正在使用的、带锁的、或没设 timeout 的(比如 <code>set_site_transient()</code> 存的跨站点缓存)。几个关键点:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8305" title="Douyin Keyword Collector"><img
src="https://img.php.cn/upload/skill/000/000/081/179196489279321.jpg" alt="Douyin Keyword Collector" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8305" title="Douyin Keyword Collector" class="overflowclass">Douyin Keyword Collector</a>
<p class="overflowclass">通过浏览器自动化访问抖音首页,在搜索栏输入关键词并在自动化流程中收集相关关键词建议</p>
</div>
<a rel="nofollow" href="/xiazai/skill8305" title="Douyin Keyword Collector" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
-
wp transient delete --all默认只清当前站点的 transient(多站点下不碰其他站) - 加
--network才清全网 transient,但需在主站目录下运行,且用户有 super admin 权限 - 想保留某些插件专用缓存?用
--include='xxx|yyy'或--exclude='woocommerce|wpml'过滤 - 加
--dry-run先预览要删哪些 key,避免误伤
注意:WP-CLI 必须在 PHP CLI 模式下运行,且 wp-config.php 里的 WP_DEBUG 最好关掉,否则大量 warning 可能撑爆内存。
插件和主题自己乱写 transient 是最大隐患
很多免费插件用 add_option( '_transient_xxx', $val ) 硬塞缓存,绕过 set_transient() 的 timeout 机制,这类记录永远不会自动过期。还有主题在 functions.php 里写 set_transient( 'latest_posts', $posts, 0 ),0 秒 = 永驻。排查这类问题得翻代码:
- 搜项目里所有
add_option和update_option调用,看有没有硬编码_transient_前缀 - 搜
set_transient(后面第二个参数是不是常量0或变量未初始化 - 用
wp transient list --format=count定期监控总量,突增说明有新 leak
真正难处理的不是已有脏数据,而是源头不停产“过期即永久”的 transient——这种得改插件代码或换替代方案,光清库只是擦灰。










