PHP错误日志排查
PHP错误日志排查
引言
线上页面白屏、500错误,前台看不到具体原因,靠猜很难定位。正确做法是开启并查看PHP错误日志,从日志里拿到文件、行号、错误类型,再针对性修复。
先确认日志位置
在phpinfo页面搜索error_log,或查看php.ini配置:
#查看php.ini错误日志配置
php -i | grep error_log
#常见位置
tail -f /var/log/php-fpm/www-error.log
tail -f /var/log/httpd/php_errors.log
宝塔、面板环境一般在日志菜单里可直接打开PHP错误日志。
开发环境临时显示错误
<?php
ini_set('display_errors',1);
ini_set('error_reporting',E_ALL);
error_reporting(E_ALL);
生产环境不要直接display_errors到页面,统一写日志。
日志格式解读
一条错误日志通常包含:错误级别、报错文件、行号、错误信息。
[12-Oct-2026 07:00:00] PHP Fatal error:
Call to undefined function xxx() in /www/app/index.php on line 18
含义:第18行调用了不存在的函数,检查函数是否引入、命名是否拼错。
常见错误类型
- Fatal error:致命错误,程序中断,如调用不存在的类、函数;
- Warning:警告不中断,如参数类型不对;
- Notice:提示,未定义变量;
- Deprecated:废弃语法,未来版本不兼容。
排查流程
- 复现问题,记录访问时间;
- 按时间过滤日志,定位对应报错;
- 打开报错文件对应行号;
- 修复后清空日志再验证。
总结
PHP排错第一步永远是看错误日志,而不是反复刷新页面。开发环境显示错误,生产环境写日志,按时间和行号快速定位,养成记录日志的习惯。
ThinkPHP6 500报错,开启错误日志查看原因
前言
ThinkPHP6网站突然500报错,页面啥也不显示,不知道哪错了?本文讲怎么开启错误显示和日志,快速定位问题。
一、为什么500不显示错误
生产环境为了安全,关闭了错误显示,直接返回500,不显示具体错误信息。
这是对的,不然用户能看到你的代码路径、数据库密码等敏感信息。
但排查问题就不方便了。
二、临时开启错误显示
修改 .env 文件
项目根目录下有个 .env 文件:
APP_DEBUG = true
把 APP_DEBUG 改成 true。
刷新页面,就能看到具体错误了。
注意
排查完记得改回 false! 生产环境不能开debug。
三、开启日志记录
就算不开debug,错误也会记录到日志文件里。
日志配置
config/log.php 文件:
return [
// 默认日志通道
'default' => 'file',
// 日志通道列表
'channels' => [
'file' => [
// 日志记录方式
'type' => 'File',
// 日志保存目录
'path' => '',
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 30,
],
],
];
日志位置
默认在 runtime/log/ 目录下。
按日期分目录:
runtime/log/
├── 2026-10/
│ ├── 08.log
│ ├── 07.log
│ └── 06.log
└── 2026-09/
└── ...
查看今天的错误
tail -f runtime/log/2026-10/08.log
四、常见500错误排查
1. 目录权限问题
runtime目录没权限写:
Permission denied
解决:
chmod -R 755 runtime
chown -R www:www runtime
2. 缺少扩展
Call to undefined function xxx()
解决: 装对应的PHP扩展。
3. 数据库连接失败
SQLSTATE[HY000] [1045] Access denied
检查: 数据库配置对不对。
.env 或 config/database.php:
'hostname' => '127.0.0.1',
'database' => '数据库名',
'username' => '用户名',
'password' => '密码',
4. 路由错误
Route not found
检查: 路由配置对不对。
5. 模板找不到
template not exists
检查: 模板文件路径对不对。
五、手动写日志
代码里可以手动写日志:
// 记录错误
Trace::error('这是一个错误信息');
// 记录警告
Trace::warning('这是一个警告');
// 记录信息
Trace::info('这是一个信息');
或者用助手函数:
trace('这是调试信息', 'debug');
六、查看PHP错误日志
除了ThinkPHP的日志,PHP本身也有错误日志。
查看PHP错误日志位置
php --ini | grep error_log
Nginx错误日志
tail -f /var/log/nginx/error.log
七、常见排查步骤
第一步:开debug看具体错误
改 .env:
APP_DEBUG = true
刷新页面,看具体报什么错。
第二步:看ThinkPHP日志
tail -f runtime/log/2026-10/08.log
第三步:看Nginx错误日志
tail -f /var/log/nginx/error.log
第四步:看PHP错误日志
tail -f /var/log/php-fpm/error.log
第五步:解决完改回debug
改完 .env:
APP_DEBUG = false
八、常见坑
坑1:开了debug还是不显示
缓存没清。
解决: 删除runtime目录下的缓存:
rm -rf runtime/cache/*
坑2:日志目录没权限
stream_socket_client(): unable to connect
runtime目录没写权限。
解决:
chmod -R 755 runtime
坑3:生产环境开着debug
危险!用户能看到你的敏感信息。
解决: 排查完立刻改回 APP_DEBUG = false。
坑4:日志太大占磁盘
日志越积越多,磁盘满了。
解决: 设 max_files,自动删除旧日志:
'max_files' => 30,
坑5:502和500搞混
- 500:PHP代码错误
- 502:PHP-FPM挂了
区分: 看Nginx错误日志。
总结
记住:
- 改
.env的APP_DEBUG = true临时看错误 - 生产环境必须改回
false - 日志在
runtime/log/目录 - 排查完记得清缓存
- 500是PHP代码问题,502是FPM问题
排查流程:
开debug → 看具体报错 → 看ThinkPHP日志 → 看Nginx日志 → 解决问题 → 关debug
遇到问题加QQ23979811 协助处理