PHP线上报错排查:从白屏到根因的五个步骤
线上PHP服务突然白屏或返回500,按“日志定位→临时开报错→追踪调用栈→核对扩展配置→检查资源限制”的顺序排查,能快速缩小问题范围,避免盲目改代码。
遇到白屏或500错误,先别急着逐行读代码。打开php.ini中error_log指定的路径,若未单独配置,则查看Nginx或Apache的错误日志。重点核对时间戳与请求ID,用grep筛选对应时间段的日志。若出现“Fatal error: Uncaught Error: Call to undefined function...”这类信息,需确认是扩展未加载还是函数名拼写错误。日志中的行号通常很准,可直接定位到具体文件。
临时开启报错,排查后必关闭
生产环境的display_errors通常关闭,排障时可在脚本入口临时添加ini_set('display_errors', 1)与error_reporting(E_ALL),让错误直接输出到页面,省去反复翻日志的麻烦。但需注意,若脚本存在语法错误,这两行可能无法执行。此时应检查文件是否上传完整,或服务器短标签设置是否与本地一致。排查完毕务必还原设置,防止敏感信息泄露。
利用debug_backtrace追踪调用栈
部分报错仅看行号不够,需明确执行路径。在可疑代码前插入var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)),输出最近两层的调用栈以理清逻辑。若是后台脚本或API接口,建议用error_log()将调试信息写入日志,避免直接echo破坏输出格式。
核对扩展与配置差异
升级PHP版本后常出现“找不到类”或“函数未定义”报错。先执行php -m查看扩展列表,确认mbstring、curl、pdo等是否加载。再用php -l检查语法,老项目迁移时极易遗漏废弃语法。若开发与生产环境表现不一,可临时使用phpinfo()对比配置差异。此外,时区警告虽不起眼,却会导致日期函数结果错乱,建议在php.ini中固定date.timezone。
检查内存与超时限制
遇到“Allowed memory size”报错,先排查循环内是否堆积大数组或查询结果未分页。尽量使用yield生成器替代数组,确需更多内存再调整memory_limit。对于“Maximum execution time”超时,需区分是死循环还是外部接口卡顿。临时用set_time_limit(0)验证可行,但线上切勿长期放开。文件加载失败时,用realpath()确认路径真实存在,并留意include_path的优先级顺序。