PHP5.6升级至7.2后错误信息无效,PHP7.2错误信息在哪查看?
解决CodeIgniter 3.0搭配PHP 7.2错误提示无法定位源码问题
问题根源
PHP7.0之后引入了全新的错误处理机制,多数原本PHP5里的致命错误现在会以Error类对象的形式抛出,而CodeIgniter 3.0的原生异常处理逻辑没有适配该特性,只会捕获Exception类异常,导致原生错误的栈信息被截断,最终只显示异常控制器里的报错位置。
第一步:调整PHP配置确保错误输出全开
- 打开你的
php.ini配置文件,确认以下参数设置:display_errors = On error_reporting = E_ALL log_errors = On error_log = /path/to/your/php_errors.log # 此处替换为服务器上可写的日志文件路径 - 重启PHP-FPM或Apache服务让配置生效。如果是虚拟主机无法修改php.ini,也可以在项目入口文件
index.php最顶部添加代码:ini_set('display_errors', 1); error_reporting(E_ALL);
注意:错误显示配置仅建议在开发环境开启,生产环境要关闭公开错误输出,避免泄露敏感信息
第二步:适配CodeIgniter异常处理逻辑兼容PHP7
你可以直接在入口文件index.php中添加全局错误捕获代码,完整保留错误栈信息,插入位置选在ENVIRONMENT常量定义之后即可:
if (ENVIRONMENT === 'development') { // 捕获PHP错误转为异常 set_error_handler(function($severity, $message, $file, $line) { if (error_reporting() & $severity) { throw new ErrorException($message, 0, $severity, $file, $line); } }); // 直接输出完整异常信息 set_exception_handler(function($e) { echo "<h1>未捕获异常:".get_class($e)."</h1>"; echo "<p>错误信息:".$e->getMessage()."</p>"; echo "<p>触发位置:".$e->getFile()." 第".$e->getLine()."行</p>"; echo "<h3>调用栈:</h3>"; echo "<pre>".$e->getTraceAsString()."</pre>"; exit; }); }
第三步:优先读取PHP原生错误日志
即使CodeIgniter的页面输出截断了错误信息,PHP原生的错误日志也会完整记录所有错误的触发文件、行数、调用栈信息,直接打开你配置的error_log对应文件,就能获取到和PHP5.6一致的精准错误提示,直接定位问题代码。
内容的提问来源于stack exchange,提问作者Jack Freiermuth
相关产品推荐
相关产品推荐

