页面白屏不报错?把 PHP 的错误日志配明白,排错效率翻倍

来源:互联网 时间:2026-08-28

线上环境出于安全把错误显示关了,这是对的——报错信息暴露路径给攻击者等于送情报。但代价是出了问题页面上啥都没有,只剩白屏。正确姿势是:页面上不显示,错误全部落日志。

; php.ini 生产环境错误处理四件套
display_errors = Off ; 页面不显示错误
log_errors = On ; 错误写日志
error_log = /var/log/php/error.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE

这四项是一套组合拳。关掉 display_errors 用户看不到报错;打开 log_errors 错误没消失只是换了地方;error_log 指定落盘位置,注意这个文件的属主要给 php-fpm 的运行用户写权限,不然错误会静默丢弃,这是新手最常见的坑;error_reporting 控制记录哪些级别,开发环境直接 E_ALL 全记。

想临时在代码里抓某个段的错误,不用改全局配置:

<?php
// 临时打开(只影响当前请求)
ini_set('display_errors', '0');
error_log("下单流程异常: user_id={$_SESSION['uid']} order={$orderNo}");

// 自定义错误处理器,把警告也记下来
set_error_handler(function($no, $str, $file, $line) {
error_log("[PHP错误] {$str} @ {$file}:{$line}");
return true;
});

error_log 写业务埋点这个用法很多人不知道:在关键流程的异常分支里记上下文,比事后查数据库反推用户干了什么高效太多。日志格式统一加前缀标签(比如 [支付]、[登录]),配合 grep 能秒筛。

# 日常巡检三连
tail -f /var/log/php/error.log # 实时盯
awk '/\[26-Aug-2026/' error.log | sort | uniq -c | sort -rn | head # 按天聚合同类错误
grep -c 'PHP Fatal' error.log # 看致命错误数

白屏问题有了日志基本一抓一个准:Fatal error 那行会直接写明文件和行号。怕日志涨太快就接上 logrotate 轮转,之前专门写过一篇。错误日志是运维的眼睛,别让它形同虚设。(数据来源:PHP官方手册 )

相关文章

标签:

A5创业网 版权所有