记一次PHP问题排查,TP3关闭debug后服务器报异常,提示页面错误

2026年1月29日服务端开发评论736字数 2011阅读6分42秒阅读模式

image-20260129211638187

公司目前有项目还在用ThinkPHP3.2,之前看服务器上的项目 APP_DEBUG 还是打开的状态,就觉得不对,但是试了下关闭发现页面会报错,赶紧恢复了。

想着能跑就行,也就没有再继续追踪这个问题了。

没想到该来的还是会来。

今天部门老大找到我,说最近在优化项目时,把 APP_DEBUG 设置 false 就会报错,让我解决一下。

当时也没觉得啥,能是啥大问题,分分钟给KO。

结果,噩梦开始了。


先是服务器上测试,报错必定会出现。

查看服务器上的日志,在 Application/Runtime/Logs/ModulesName/YY_MM_DD.log ,看到有一个报错,类似这样:

[ 2026-01-29T18:04:04+08:00 ] 13.xxx.xxx.195 /p/foo
ERR: Cron:statistic Runat 2026-01-29 18:04:04 Use 0.000112 s

尝试解决,咔咔一顿操作,甚至都注释掉 Application/Common/Conf/crons.php 中所有的内容,问题依旧。

心想不能再在服务器上搞了,再测试下去,业务不能要了。

本地搞个开发环境,选择相同 PHP 版本,结果,一次性通过,完全没问题。

无奈去找报错源,在这里 ThinkPHP/Library/Behavior/CronRunBehavior.class.php ,又是一顿测试,没找到报错点。

我直接把这个方法给屏蔽掉,再测试,还是报错依旧。

删除所有缓存,再测试,还是报错。

不过再多看几眼日志,发现最近好像没有新的错误日志记录了,也就是说 ERR: Cron:statistic Runat 实际上被解决了。


可是页面错误!请稍后再试~依然存在,但是错误日志却再也没有新的记录,这就有点难办了!

无奈,追踪 ThinkPHP3.2 源码,看看到底跑到哪里出了问题,一顿追踪,最终锁定在了一个奇怪的地方:

ThinkPHP/Common/functions.php 中有一个方法 controller(),用于实例化访问控制器,在其中有一个判断 class_exists($class) ,到这里后就报错了。

class_exists 不是官方的方法吗?怎么能在这里出错呢?

只能再借助于互联网学习相关知识,大概了解是 TP3 有自己的加载机制,如果 class_exists 第二个参数不传的话,会用框架自己的加载机制。

大概查看了下 TP3 的加载逻辑,又是一阵头大。

当时只有一个念头,升级 ThinkPHP 框架!

和部门老大沟通了下,他也很乐意升级,只要我保证业务正常就行。

于是我大概看了下代码,一堆单字母的助手函数,如 I()M()D() ,我就知道这工作量小不了,虽然 TP 高版本也有类似的助手函数,但是我也不可能直接无脑换方法名吧,还得梳理一遍业务逻辑,想着还是最好别动!

于是,默默回到自己的工位,继续排查。


看着黑漆漆的控制台,有点不知道该咋办了。

结果脑子里突然蹦出,php-fpm 不也是有日志吗?那边会不会有线索呢?

于是直接 ls /var/log/ 发现确实有很多 php-fpm 的日志。

直接 tail 看了下,毫无价值,都是正常的使用记录,当时就很疑惑,难道 php-fpm 没有单独的错误日志吗?

继续查资料,得到答案:有,但默认没开

打开 php-fpm 的配置,填入下面信息:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
log_errors = On
error_log = /var/log/php_errors.log
display_errors = Off

重启 php-fpm,然后去目录下找日志,还是没有错误日志!

网上一了解才知道,这个日志 PHP 不会主动创建

于是手动创建这个日志文件:

touch /var/log/php_errors.log
chown www-data:www-data /var/log/php_errors.log
chmod 664 /var/log/php_errors.log

再查看该文件,果然一堆数据就蹦了出来,都是相同的错误:

[29-Jan-2026 20:39:02 PRC] PHP Fatal error:  Cannot redeclare GetPage() (previously declared in /path/to/project/Application/Runtime/common~runtime.php:1) in /path/to/project/Application/Common/Common/function.php on line 20

这个错误我可太熟悉了,之前的老代码就出现过该问题,快速解决了下。

删除 TP3 缓存 sudo rm -f Application/Runtime/common~runtime.php

再测试,成功,终于不用再看到 页面错误!请稍后再试~ 了。


事后想了下原因,大概是这样,直接上我和部门老大说的截图吧:

image-20260129214653215

收获两个大拇指,开心收工!

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定