温馨提示×

PHP错误如何在Ubuntu排查

小樊
43
2025-11-14 21:21:18
栏目: 编程语言

Ubuntu排查PHP错误的实用流程

一 定位日志位置

  • 先确定使用的组件与PHP版本:查看版本用php -v;查看已启用模块用php -m;定位加载的配置文件用php --iniphp -i | grep ‘Loaded Configuration File’
  • 常见日志路径与用途如下(按你的实际环境选择):
组件 日志路径 说明
Apache /var/log/apache2/error.log Web服务器错误,常包含PHP致命错误与启动问题
Nginx /var/log/nginx/error.log FastCGI/上游错误,常与PHP-FPM交互相关
PHP-FPM /var/log/php-fpm.log/var/log/php7.x-fpm.log FPM进程日志(进程启动、慢请求等)
PHP错误日志 php.inierror_log指定 可能是自定义路径,如**/var/log/php_errors.log**
  • 快速查看与跟踪:
    • 实时跟踪Apache:sudo tail -f /var/log/apache2/error.log
    • 实时跟踪Nginx:sudo tail -f /var/log/nginx/error.log
    • 实时跟踪FPM:sudo tail -f /var/log/php7.x-fpm.log
    • 若配置了自定义PHP错误日志,直接跟踪该文件即可。

二 打开错误显示与日志

  • 编辑对应环境的php.ini(如:/etc/php/版本号/apache2/php.ini/etc/php/版本号/fpm/php.ini):
    • 开启日志:log_errors = On
    • 指定日志文件:error_log = /var/log/php_errors.log(确保目录可写)
    • 开发环境建议:display_errors = Onerror_reporting = E_ALL
    • 生产环境建议:display_errors = Offerror_reporting = E_ALL(仅记录日志,不在页面暴露)
  • 修改后重启服务使配置生效:
    • Apache:sudo systemctl restart apache2
    • Nginx + PHP-FPM:sudo systemctl restart nginx && sudo systemctl restart php7.x-fpm
  • 若使用FPM,也可在FPM池配置(如www.conf)中设置catch_workers_output = yes与**php_admin_value[error_log]**来捕获工作进程输出。

三 常见错误与快速修复

  • 语法或致命错误:查看日志中的Fatal error/Parse error及行号,优先修复语法、未定义函数/类等问题。
  • 扩展缺失:日志出现“Call to undefined function”多为扩展未安装,安装对应扩展(如php-mbstring):sudo apt-get install php-mbstring,然后重启服务。
  • 资源限制:出现“Allowed memory size exhausted”等,适当提升memory_limit(如128M/256M)。
  • 权限问题:确保Web服务用户对代码目录有读取/执行权限,常见做法:
    • 所有权:sudo chown -R www-data:www-data /path/to/php/files
    • 权限:sudo chmod -R 755 /path/to/php/files
  • 配置错误:修改php.ini后未生效,多为改错文件或未重启;用php --ini确认加载的配置文件路径,并重启对应服务。

四 深入排查工具与命令

  • 命令行快速验证脚本:
    • CLI执行:php -l /path/to/file.php(语法检查)
    • 直接运行:php /path/to/file.php(观察CLI报错)
  • 模块与版本:
    • 查看版本:php -v
    • 查看模块:php -m
  • 在代码中主动记录:使用error_log(“message”, 0);写入到error_log指定位置,便于追踪业务流程问题。
  • 交互式调试:安装并启用Xdebug,结合IDE进行断点、变量与调用栈分析。

五 生产环境注意事项

  • 关闭页面显示错误:display_errors = Off;保持log_errors = On并将日志写入受限目录。
  • 定期轮转日志:使用logrotate管理**/var/log/php_errors.log**等,避免磁盘被占满。
  • 谨慎暴露路径与敏感信息:错误页与日志中避免输出数据库凭据、密钥等。
  • 变更后务必重启:apache2nginxphp-fpm任一配置调整后都要重启对应服务。

0