PHP 8.0起track_errors指令被彻底移除,需删除或注释php.ini中该行,并清除代码中ini_set('track_errors', ...)调用,改用set_error_handler()或error_get_last()替代$php_errormsg。

PHP 7.2 升级到 8.x 后出现 Fatal error: Directive 'track_errors' is no longer available in PHP,是因为该配置项已在 PHP 8.0 中**彻底移除**,不是“失效”,而是“不存在”。它和关联的 $php_errormsg 变量一同被删除,任何残留使用都会导致脚本直接中断。
确认并清理 php.ini 中的 track_errors
这个指令在 php.ini 里已无意义,必须删掉或注释掉:
- 打开实际生效的
php.ini文件(用phpinfo()查看 Loaded Configuration File 路径,别改错文件) - 搜索
track_errors,找到类似track_errors = On或track_errors = Off的行 - 整行删除,或在前面加分号注释:
;track_errors = On - 保存后重启 Web 服务(如 Apache/Nginx)或 PHP-FPM 进程
检查代码中是否手动调用 ini_set('track_errors', ...)
有些老项目会在脚本开头用 ini_set() 动态开启,这在 PHP 8+ 会直接报错:
- 全局搜索项目中的
ini_set\(.+?track_errors(可用 IDE 或命令行grep -r "ini_set.*track_errors" .) - 删除所有类似
ini_set('track_errors', 1);的语句 - 不要试图改成
ini_set('track_errors', 0)——该指令已不可设置,仍会报错
替换 $php_errormsg 的替代方案
$php_errormsg 在 PHP 8.0 起已被移除,不能再依赖它捕获上一个错误。应改用标准错误处理机制:
立即学习“PHP免费学习笔记(深入)”;
- 用
set_error_handler()捕获运行时错误,并记录或处理 - 对可能出错的函数调用,改用
try...catch(尤其涉及异常抛出的场景) - 需要调试时,可临时用
error_get_last()获取最近一次错误(仅限最后一条,且非所有错误都适用)
验证是否还有其他兼容性隐患
track_errors 报错常是升级后的第一个显性信号,背后往往还藏着更多 PHP 7.2 → 8.x 的兼容问题:
- 检查是否用了已废弃的函数,比如
mysql_*、mbstring.func_overload - 注意
is_resource()对 cURL、GD 等资源返回false(因它们已转为对象) - 运行
php -l检查语法,再用PHPCompatibility工具扫描全项目



















