一次 Typecho 插件故障的完整自救记录:从报错到恢复 🚑
前言
前两天,我的 Typecho 博客突然就挂了😱。罪魁祸首是一个叫 WebFirewall 的插件。这玩意儿出问题后,后台那个“禁用”按钮怎么点都没反应,最后整个博客直接摆烂,给我看这个报错:
call_user_func_array(): Argument #1 ($callback) must be a valid callback,
class "TypechoPlugin\WebFirewall\WebFirewall" not found折腾了好几个小时,总算是把它给收拾服帖了。这篇就把我完整的排查和修复过程记录下来,万一你哪天也遇到这糟心事,希望能帮你省点时间⏰。
一、事情是怎么发生的?🤔
整个过程是这样的:
- 我装了个
WebFirewall插件 - 这货可能跟我博客里别的插件八字不合,或者它自己就有 bug
- 我想去后台把它禁了,结果那个“禁用”按钮就是个摆设,点了一万遍都没反应
- 一刷新页面,好家伙,博客直接给我脸色看,白屏报错,前台后台都进不去了
当时的状态就是:
- ✅ 前台:无法访问(卒)
- ✅ 后台:也进不去(双卒)
- ✅ 插件文件:虽然还在,但已经是个废物了
- ✅ 禁用按钮:彻底失灵
二、试试“曲线救国
注意,请异地导出你的数据库再进行以下操作
2.1 上传一个“空壳”插件
当你强制删除了WebFirewall,报错不是说找不到 WebFirewall 这个类吗?那我给它一个不就完了!
在 /usr/plugins/WebFirewall/ 目录下创建一个 Plugin.php 文件,里面就写这几行:
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
class WebFirewall_Plugin {}上传,刷新网站——报错依然坚挺。
这说明问题根子不在文件里,而是在数据库里。
三、直捣黄龙,查数据库!🔍
3.1 登录数据库
我用的是 1Panel 面板,直接点进 phpMyAdmin 就是干。
3.2 找到关键线索表
Typecho 的插件信息都藏在 typecho_options 表里,最关键的一行是 name = 'plugins'。
点开看 value 字段,好家伙,一串长长的序列化字符串,里面果然有料:
...s:10:"WebFirewa";a:1:{s:13:"activated";b:1;s:7:"version";s:5:"1.0.0";}...
看到了吧,数据库里还死死记着这个插件是“已激活”状态呢!
3.3 地毯式搜索,不留死角
为了清干净,我执行了 SQL 语句,看看还有哪儿藏着它:
SELECT * FROM typecho_options WHERE value LIKE '%WebFirewa%';结果发现:
plugins字段里有它panelTable字段里居然也有它的影子
四、终极清理,一招制敌 💪
4.1 清空插件列表(最暴力也最有效)
直接把 name = 'plugins' 那一行的 value 改成:
a:0:{}这串代码的意思就是“没有任何启用的插件”。简单粗暴,但有效!
UPDATE typecho_options SET value = 'a:0:{}' WHERE name = 'plugins';4.2 清理 panelTable 里的残留
UPDATE typecho_options
SET value = REPLACE(value, 's:10:"WebFirewa";a:1:{s:13:"activated";b:1;s:7:"version";s:5:"1.0.0";}', '')
WHERE name = 'panelTable' AND value LIKE '%WebFirewa%';4.3 见证奇迹的时刻✨
修改完数据库,怀着激动的心,颤抖的手,刷新博客首页——恢复了!恢复了! 我的博客又回来了!
五、打扫战场,收尾工作 🧹
5.1 重新启用插件
赶紧登录后台 → 插件管理,把我之前用的那些正经插件(比如 pScaleUpPlus、AutoSlug 这些)重新启用起来。谢天谢地,配置都还在,不用重新设置。
六、吃一堑,长一智的经验总结 📝
6.1 插件故障时,UI 按钮就是个弟弟
插件自己都挂了,它那个“禁用”按钮的代码根本跑不起来。这时候:
- ✅ 直接操作数据库,那才是最根本的解决方案
- ❌ 死磕后台那个按钮,只会让你怀疑人生
七、给兄弟姐妹们的几句心里话 ❤️
- 数据库一定要定期备份! —— 这玩意儿关键时刻能救你老命
- 插件这玩意儿,够用就行,别贪多 —— 每多一个插件,就多一个潜在的雷
- 学会直接操作数据库 —— 这是绕过所有 UI 故障的终极大招,值得拥有
结语
这次故障从发生到解决,前前后后花了差不多半天。虽然过程挺折腾人的,但也让我对 Typecho 的插件原理、数据库结构、以及缓存策略这些,都有了更深的理解。
如果你也遇到类似的倒霉事儿,希望这篇文章能给你指条明路,少走点弯路。
有啥问题或者想交流的,欢迎在下面留言!👇
实操有效!按你的方法进phpMyAdmin改了plugins字段,瞬间复活。多谢大佬分享,已收藏⭐
虽然看不太懂SQL那段,但感觉作者写得很详细,先码住备用。顺便问下,1Panel面板好用吗?我还在用宝塔
提个建议,其实不用清空整个plugins,可以直接反序列化把那个插件删掉就行。不过暴力法确实适合新手,赞一个
文章开头写“完整自救记录”,结果就是改两行SQL?这叫完整?
真服了,还“直捣黄龙”,进个phpMyAdmin就叫直捣黄龙了?装逼装得挺像。
写得啰里八嗦的,半天没看到重点,差评!