Deprecated警告表示PHP官方已标记某些函数或语法为不推荐使用,将在PHP 9.0等后续版本中移除;需通过修改php.ini设error_reporting=24575(E_ALL & ~E_DEPRECATED)、更新代码或升级依赖来解决。

PHP 8.2 运行旧项目报 Deprecated 错误,不是代码写错了,而是 PHP 官方把一批老函数/语法标记为“不推荐使用”,并准备在后续版本(如 PHP 9.0)中彻底删除。这类警告默认会被 error_reporting(E_ALL) 捕获,但不会中断执行——可一旦你开了 display_errors = On 或日志没关,它就会刷屏,甚至让 CMS 安装卡住。
为什么 error_reporting(E_ALL & ~E_DEPRECATED) 在 php.ini 里不生效
php.ini 不支持表达式计算。你写 error_reporting = E_ALL & ~E_DEPRECATED,PHP 实际当字符串处理,等效于 0,结果所有错误都不报了。
- 查当前真实生效值:在脚本里加
var_dump(error_reporting());,别信配置文件里写了啥 - 安全写法是填整数——PHP 8.2 的
E_ALL值仍是32767,E_DEPRECATED是8192,所以32767 & ~8192=24575 - 直接在 php.ini 里写
error_reporting = 24575,保存后必须重启 PHP 服务(不是重载 Nginx/Apache) - 如果用宝塔面板,改完要进对应 PHP 版本页 → 重载配置,否则 fastcgi 还按旧参数转发请求
error_reporting() 函数调用为什么有时没反应
这个函数只控制运行时错误的报告开关,不碰 display_errors 和 log_errors,更捕获不到 Parse error 或 Fatal error。
- 必须放在出错代码之前,且不能被条件包裹(比如
if (DEBUG) { error_reporting(E_ALL); }却没进分支) - 写在
require或include之后?那前面的Deprecated就漏掉了 - 想看到语法错误,得靠 php.ini 的
display_errors = On,或运行时ini_set('display_errors', '1') - 线上环境严禁开
display_errors,否则mysql_connect()失败时密码可能直接打在页面上
开发环境 vs 生产环境该设什么值
开发时要“宁可错报,不可漏报”;生产时要静默失败,但不能静默到连 require 找不到文件都不知道。
- 开发推荐:
error_reporting = 32767(即E_ALL),display_errors = On,log_errors = On - 生产必须:
display_errors = Off,log_errors = On,error_reporting = 255(即E_ERROR | E_WARNING | E_PARSE) -
E_NOTICE和E_DEPRECATED可关,但别连E_WARNING一起关——fopen()权限失败、file_get_contents()超时都是 warning,关了就没了日志 - WordPress 6.7+、Laravel 11 已明确拒绝加载 PHP 8.0 以下版本,但它们自己也大量用
Deprecated函数,所以升级 PHP 后第一件事不是改代码,是先压住警告看功能是否正常
临时压制 Deprecated 但别长期留着
过渡期可用 error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE,但注意这行在 php.ini 里依然无效,得换算成整数 24567(32767 & ~8192 & ~8)。
- 更稳妥的做法是在入口文件(如
index.php)顶部加:error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE); - 同时确保
ini_set('display_errors', '0');和ini_set('log_errors', '1');都显式调用 - 别用
@运算符全局压制——它会拖慢性能,还掩盖真正的问题 - 2026 年起,PHP 官方已停止为 8.1 及更早版本提供安全更新,
Deprecated不是提醒你“改起来麻烦”,是在说“再不处理,下个漏洞你就得裸奔”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











