定位 PHP 日志中的异常,通常可以按下面这个系统化思路来做,从“在哪看”到“怎么看”,再到“如何快速定位根因”。
常见位置:
; php.ini
error_log = /var/log/php/php_error.log
或:
/var/log/php-fpm.log
/var/log/nginx/error.log
/var/log/apache2/error.log
查看当前生效配置:
php -i | grep error_log
/var/log/nginx/error.log
/var/log/nginx/access.log
/var/log/apache2/error.log
storage/logs/laravel.log
runtime/log/
error_log('msg');
error_reporting = E_ALL
display_errors = Off
log_errors = On
⚠️ 生产环境一定要关闭 display_errors,只写日志
| 类型 | 关键字 | 说明 |
|---|---|---|
| Fatal Error | Fatal error |
程序直接终止 |
| Parse Error | Parse error |
语法错误 |
| Warning | Warning |
不中断但异常 |
| Notice | Notice |
通常是未定义变量 |
| Exception | Uncaught Exception |
未捕获异常 |
| 500 错误 | 500 Internal Server Error |
通常对应 Fatal |
先用时间缩小范围:
grep "2026-01-21 10:" php_error.log
grep -E "Fatal|Exception|Error" php_error.log
PHP 异常通常包含:
PHP Fatal error: Uncaught RuntimeException: xxx
Stack trace:
#0 /data/app/User.php(23)
#1 /data/app/Index.php(45)
重点看:
如果是 Web 请求异常:
grep "POST /api/login" access.log
再对比 error.log 时间,确认是否同一请求。
SQLSTATE[HY000] [2002] Connection refused
✅ 排查:
Allowed memory size exhausted
✅ 排查:
php -i | grep memory_limit
或代码中:
memory_get_usage(true);
Maximum execution time exceeded
✅ 排查:
max_execution_timefailed to open stream: Permission denied
✅ 排查:
ls -l 文件
ps aux | grep php
set_exception_handler(function ($e) {
error_log($e);
});
error_log(uniqid() . ' ' . $message);
{
"time": "2026-01-21 10:00:00",
"level": "ERROR",
"msg": "db connect failed",
"trace": "..."
}
看时间 → 找异常 → 看堆栈 → 对请求 → 查环境
如果你愿意,可以直接把一段 PHP 日志贴出来,我可以帮你逐行分析具体异常原因。