Ubuntu下PHP日志报错排查与修复
一、快速定位日志位置
- 先摸清你的运行环境——是 Apache 还是 Nginx + PHP-FPM,或者用 mod_php?不同组合,日志存放的位置天差地别。常见路径梳理如下:
- Apache:Web 服务的错误日志默认在
/var/log/apache2/error.log。PHP 本身的错误是否写进这个文件,取决于 PHP 的配置。关键点:如果用的是 mod_php,错误通常就写在这里;如果走 PHP-FPM,则另算。 - Nginx:Web 服务的错误日志在
/var/log/nginx/error.log。注意,PHP-FPM 产生的错误一般不会出现在这个文件里。 - PHP-FPM:常见路径是
/var/log/php-fpm.log或/var/log/php7.x-fpm.log(把7.x换成你实际的 PHP 版本)。 - 自定义日志:如果
php.ini里设置了error_log选项,那就按那个路径找。
- Apache:Web 服务的错误日志默认在
- 实时追踪最新日志,最直接的办法就是 tail 命令,比如:
sudo tail -f /var/log/apache2/error.logsudo tail -f /var/log/nginx/error.logsudo tail -f /var/log/php7.4-fpm.log
- 如果实在不确定日志到底写到了哪里,用下面两步确认:
- 执行
php --ini,看看当前加载的是哪个php.ini。 - 在 Web 根目录下创建一个
phpinfo.php文件,内容就写,然后浏览器访问它,搜索error_log这一项,实际路径一目了然。
- 执行
二、让PHP把错误写到日志
- 编辑对应 SAPI 的
php.ini(路径示例:/etc/php/7.x/apache2/php.ini或/etc/php/7.x/fpm/php.ini),需要修改以下几项:- 开启日志:
log_errors = On - 指定日志文件:
error_log = /var/log/php_errors.log(要确保目标目录对 Web 用户可写) - 生产环境建议:
display_errors = Off;开发环境可以临时设为On方便调试。 - 报告级别:
error_reporting = E_ALL,把能报的错误都报出来。
- 开启日志:
- 改完配置后,一定要重启对应的服务才能生效:
- Apache:
sudo systemctl restart apache2 - Nginx + PHP-FPM:
sudo systemctl restart php7.x-fpm && sudo systemctl restart nginx
- Apache:
- 如果用的是 PHP-FPM,还需要检查
/etc/php/7.x/fpm/php-fpm.conf或www.conf中的error_log配置是否开启并且指向了有效路径。很多人只改了php.ini,却忘了 FPM 自身的日志配置,结果依然看不到报错。
三、常见报错场景与处理
- 语法错误或致命错误导致空白页:这种情况最头疼——页面一片空白,连个错误提示都没有。去 Apache/Nginx 错误日志或 PHP-FPM 日志里,会明确告诉你哪个文件、哪一行出了问题。先修正语法或解决依赖问题。
- 类/函数未定义或扩展缺失:日志里会出现
Call to undefined function或Class '…' not found。对应的解决办法是安装缺失的扩展,比如php-mbstring、php-curl、php-gd等,装完别忘了重启服务。 - 权限与所有权问题:确保 Web 服务用户(通常是
www-data)对代码目录有读取权限,对需要写入的目录(比如上传、缓存目录)有写权限。一个经典的操作组合:sudo chown -R www-data:www-data /var/www/htmlsudo find /var/www/html -type d -exec chmod 755 {} ;sudo find /var/www/html -type f -exec chmod 644 {} ;
- 资源限制(内存、执行时间):日志中间出现
Allowed memory size exhausted或Maximum execution time exceeded时,打开php.ini,调大memory_limit和max_execution_time这两个参数,然后重启。 - 配置错误:修改了
php.ini或 FPM 池配置后,服务可能直接起不来。这种情况优先去看对应的启动日志(比如journalctl -u php7.4-fpm),找到具体的错误信息,修正后再启动。
四、高效排查命令清单
- 实时跟踪错误:
sudo tail -f /var/log/apache2/error.logsudo tail -f /var/log/nginx/error.logsudo tail -f /var/log/php7.4-fpm.log
- 检索关键字(比滚动看日志快得多):
grep -i "error|fatal|warning" /var/log/php_errors.log
- 确认配置与扩展:
php --ini查看当前加载的 php.iniphp -m | grep -i mbstring检查某个扩展是否已启用
- 重启服务:
sudo systemctl restart apache2sudo systemctl restart php7.4-fpmsudo systemctl restart nginx
五、实用建议
- 生产环境务必坚持
display_errors = Off、log_errors = On,避免敏感信息泄露到页面上。开发环境可以临时打开显示错误,方便调试。 - 用
phpinfo()和php --ini双重确认实际生效的php.ini和error_log路径,避免辛辛苦苦改错了文件。 - 如果采用 PHP-FPM,同时检查 FPM 主配置和进程池配置中的
error_log与日志级别。必要时把log_level临时调到notice或debug,获取更详细的信息(排查完记得调回默认值)。 - 修改配置或安装扩展后,养成习惯:重启服务并马上观察日志,确认变更生效且没有产生新的报错。这一步很多人嫌麻烦跳过了,结果排查了半天发现配置根本没加载。