排查PHP报错需提供三要素:最小可复现代码、精准日志片段(含错误级别、路径、行号及前后5~10行)、明确运行环境(PHP/WEB服务器版本、关键ini配置、扩展状态),缺一不可。

排查PHP报错,关键不是“猜”,而是给AI或同事提供三样东西:一段可复现的代码、一份干净的日志片段、一个明确的运行环境描述。这三者缺一不可——少了日志,AI看不到错误现场;少了环境,可能连扩展都没装全;少了最小复现代码,问题就藏在几百行里出不来。
日志要截得准:只留关键上下文
不要直接甩整份 error.log 过来。重点提取:
- 报错发生前后的5~10行(含时间戳、请求路径、PHP进程ID)
- 完整错误行本身,包括错误级别(如 E_WARNING)、文件路径、行号、消息内容(例如 “file_get_contents(): open_basedir restriction in effect”)
- 如果涉及数据库,带上 SQLSTATE 码或 PDO 异常堆栈的前两层
- 避免截图——复制纯文本,保留换行和缩进,方便 grep 或正则匹配
环境描述要具体:拒绝“我用的是最新版”
“PHP版本”“操作系统”“Web服务器”这些不能只写名称,得带版本和关键配置:
- PHP:运行 php -v 和 php --ini,注明是否 CLI 或 FPM 模式,以及 open_basedir、disable_functions 是否启用
- Web 服务:Nginx 版本 + 是否启用了 fastcgi_intercept_errors;Apache 则注明 mod_php 还是 php-fpm
- 扩展依赖:用 php -m | grep -E "(pdo|mysqli|curl|mbstring)" 快速确认核心扩展是否存在
- 如果报错与上传、SSL、时区相关,额外说明 upload_max_filesize、date.timezone 等 ini 值
最小复现代码要“真最小”:删到只剩报错本身
不是把整个控制器贴出来,而是剥离业务逻辑,只保留触发错误的最小闭环:
立即学习“PHP免费学习笔记(深入)”;
- 从报错行反推:比如日志说 line 42: Undefined index: user_id,那就只写 var_dump($_GET['user_id']); + 附上模拟请求 URL
- 涉及文件操作?用 file_put_contents('/tmp/test.txt', 'test'); 替代业务路径,再检查权限和 open_basedir 限制
- 涉及数据库?改用内存 SQLite 或 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION 后直连,绕过 ORM 封装
- 务必包含 error_reporting(E_ALL); ini_set('display_errors', '1'); 开头,确保错误能被看到
附赠一个检查清单(发之前快速过一遍)
发给AI前,花30秒确认:
- 日志里有没有敏感信息(数据库密码、API密钥、用户手机号)?已脱敏
- 环境描述中有没有写“应该没问题”“默认配置”这类模糊表述?已替换为真实命令输出
- 复现代码能否独立运行?不依赖 autoload、config、session_start() 等前置动作
- 是否说明了“预期结果”和“实际结果”?例如:“期望返回数组,实际抛出 Warning 并中断”



















