周一早上打开站,前台一片白,什么都不显示。后台能进,插件列表里有两个显示更新失败。上周五还好好的,中间没人动过服务器。服务器自己动了,WordPress的自动更新在周末跑了一次。小版本默认自动装,插件默认也自动装,很多人不知道后面这一条。默认配置里,安全更新和插件更新是两码事,前者拦不住后者。面板上一句更新已完成,实际只装了一半。
自动更新是好事,问题在没有回滚路径。更新到一半,插件新版本要求PHP8.1,站点还停在7.4。新版本文件已经覆盖上去,激活时抛了致命错误,整站跟着挂。后台也进不去,只能走文件。
第一步是看日志,你先别急着删插件目录。wp-content下面的debug.log如果开着,一行PHP Fatal error会指出具体文件。没开的话,去面板的错误日志里找,时间和白屏的时间对得上。日志里出现call to undefined function这类提示,基本就是PHP版本不够。出现class not found,多半是插件之间的加载顺序变了。还有一种是内存超了,日志里写allowed memory size exhausted,那要回头改memory_limit。这三种指向的方法完全不同。
恢复最快的办法不是修代码,是把插件目录改名。WordPress检测到插件文件消失,会在后台自动把它停用,站点立刻能进。能进后台之后再从插件页装回旧版本,旧版本的zip在wordpress.org的插件页面底部还能下到。覆盖之前先把旧目录整个打包,出问题还能退回去。命令行的话,wp plugin deactivate --all一条就够。
在wp-config.php里把DISALLOW_FILE_MODS设成true,后台就没有装插件和改文件的权限了,更新只能手动做。代价是安全补丁也得自己盯着。装插件改走FTP或者命令行,步骤多一步。这一条适合已经稳定下来的站。
完全关掉自动更新也不对,安全补丁不及时,风险更大。折中的做法是核心只自动装小版本,插件和大版本都关掉。在wp-config.php里写AUTOMATIC_UPDATER_DISABLED只挡开发版和翻译,挡不住插件,很多人写错这一条。插件那条要单独用add_filter把auto_update_plugin返回false。这两条各管一段,混着写等于没写。改完去插件页面刷新,看自动更新那一列的图标有没有变。
现在这套站是核心小版本自动,插件全手动,更新前先打一份文件和数据库的快照。快照不占多少空间,出问题五分钟能回。另外把WP_DEBUG和WP_DEBUG_LOG临时打开,更新完看一天日志。有报错就在那儿摆着,不用等用户来投诉。这套流程一个月跑一次,比出事之后再翻备份快。真出事时,最贵的不是修,是不知道从哪儿开始修。插件更新前先看它的兼容性声明,写着requires PHP 8.1的直接跳过。版本号差一个大版本的,一律先观望一周。观望期里先用测试站跑一遍。
A5创业网 版权所有