主机把默认 PHP 提到 8.2,我先查了这几处

· zblog · 阅读 1
摘要

切到 PHP 8.2 的当天下午,后台是白的。不是数据库断了。有个老插件还在调 PHP 8 里已经删掉的函数,整个请求直接停。 报错其实就一行 我一开始以为主题模板写坏了。刷新了两三次,还去看是不是伪静态规则丢了。都不是。 错误日志里就这一

切到 PHP 8.2 的当天下午,后台是白的。不是数据库断了。有个老插件还在调 PHP 8 里已经删掉的函数,整个请求直接停。

报错其实就一行

我一开始以为主题模板写坏了。刷新了两三次,还去看是不是伪静态规则丢了。都不是。

错误日志里就这一句:Call to undefined function create_function()。这函数 PHP 7.2 开始弃用,PHP 8.0 移除。8.2 当然也没有。

同类的还有 each()。老代码拿它遍历数组,PHP 8 里函数本身不存在,后面的逻辑全不跑。还有 get_magic_quotes_gpc(),有的插件用它决定要不要 stripslashes,调用这一下就致命错误。

我站上真正命中的是一个很久没更新的插件,主题里倒没搜到。你的站不一定一样,别按我这份结果去删文件。

我只搜自己装的目录

核心我没动。升级时核心会被盖掉,在里面打补丁不划算。

grep -R -n -E "create_function|get_magic_quotes_gpc" zb_users/plugin zb_users/theme

each( 太容易搜到别的词,我没拿它扫全库。对着日志里的文件和行号打开看,更快。

命中在插件里的,能换版本就换。不能换就先停用。主题里的旧函数也一样,改完记一下,免得下次换主题把旧文件又拷回来。

切版本之前留了退路

面板里还能一键回到 PHP 8.1,我才切的 8.2。白屏那几分钟就是切回去,确认后台能进,再逐个开插件。

回退之后我没有把插件全开。先只开必用的,首页和后台各点一次,再加下一个。一次全开的话,分不清是哪一个在报错。

有的主机切 PHP 要重载 PHP-FPM,页面会再撑一会儿。别以为没生效,又去改别的配置。

还有个小坑。开了 OPcache 的话,旧的编译缓存可能还指着旧文件。我是重启过一次 PHP,才确定新代码生效。没验证过别的缓存插件,可能跟你环境有关。

这套只在我这家主机上试过。面板要是不能回退,先在本地用 8.2 跑一遍,别直接在线上切。