500 错误排查指南

500 错误排查指南

快速诊断

  1. 运行诊断脚本

``bash php diagnose500.php </code>`<code> 或通过浏览器访问:</code>http://your-domain.com/diagnose500.php`

  1. 检查错误日志

- Apache: /var/log/apache2/error.log - Nginx: /var/log/nginx/error.log - PHP-FPM: /var/log/php-fpm/error.log - 应用日志: logs/error_*.log

常见原因和解决方案

1. PHP 版本过低

症状: 页面显示 500 错误

检查:

php -v

要求: PHP 8.0 或更高版本

解决: 升级 PHP 版本


2. 缺少必需扩展

症状: 诊断脚本显示缺少扩展

检查:

php -m | grep mbstring
php -m | grep json

解决: 安装缺少的扩展

# Ubuntu/Debian
sudo apt-get install php-mbstring php-json

# CentOS/RHEL
sudo yum install php-mbstring php-json

3. Composer 依赖未安装

症状: vendor/autoload.php 不存在

解决:

composer install --no-dev --optimize-autoloader

4. 文件权限问题

症状: 无法写入缓存或日志

检查:

ls -la _blog/src/cache
ls -la logs

解决:

# 设置目录权限
chmod 755 _blog/src/cache
chmod 755 logs

# 如果使用 Web 服务器用户(如 www-data)
chown -R www-data:www-data _blog/src/cache
chown -R www-data:www-data logs

5. 语法错误

症状: PHP 语法错误

检查:

php -l _blog/config.php
php -l index.php

解决: 修复语法错误


6. 环境变量配置问题

症状: .env 文件不存在或配置错误

解决:

  1. 复制 env.example.env
  2. 根据实际情况修改配置
  3. 确保 .env 文件可读(权限 644)

7. 路径问题

症状: 找不到文件或类

检查:

  • 确保所有文件路径正确
  • 检查 composer.json 中的 autoload 配置

解决:

composer dump-autoload

8. 内存限制

症状: 内存耗尽

检查: 查看错误日志中的内存相关错误

解决: 在 php.ini 中增加内存限制

memory_limit = 256M

或在 .htaccess 中设置(Apache):

php_value memory_limit 256M

9. 错误显示被禁用

症状: 只显示 500 错误,没有详细信息

解决: 临时启用错误显示(仅用于调试)

index.php 开头添加:

error_reporting(E_ALL);
ini_set('display_errors', '1');

注意: 生产环境应关闭错误显示,只记录到日志


10. Web 服务器配置问题

Apache

检查 .htaccess 文件:

# 确保 mod_rewrite 已启用
RewriteEngine On

# 确保 PHP 版本正确
AddHandler application/x-httpd-php80 .php

Nginx

检查配置:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

调试步骤

  1. 启用错误显示(临时)

``php errorreporting(EALL); iniset(&apos;displayerrors', '1'); iniset(&apos;logerrors', '1'); iniset(&apos;errorlog', DIR . '/logs/php_errors.log'); ``

  1. 检查错误日志

``bash tail -f logs/error_*.log tail -f /var/log/apache2/error.log # Apache tail -f /var/log/nginx/error.log # Nginx ``

  1. 逐步测试

- 先测试 diagnose_500.php - 再测试简单的 PHP 文件 - 最后测试完整的应用

  1. 检查依赖

``bash composer install --no-dev composer dump-autoload ``


生产环境最佳实践

  1. 关闭错误显示

``php iniset(&apos;displayerrors', '0'); iniset(&apos;logerrors', '1'); ``

  1. 配置错误日志

``php iniset(&apos;errorlog', DIR . '/logs/php_errors.log'); ``

  1. 设置适当的文件权限

- 目录: 755 - 文件: 644 - 可写目录(cache, logs): 755 或 775

  1. 使用环境变量

- 创建 .env 文件 - 不要提交 .env 到版本控制 - 使用 env.example 作为模板

  1. 定期检查日志

``bash tail -f logs/error_*.log ``


获取帮助

如果以上方法都无法解决问题:

  1. 运行 diagnose_500.php 并保存完整输出
  2. 检查错误日志的最后 50 行
  3. 检查 Web 服务器错误日志
  4. 提供 PHP 版本、Web 服务器类型和错误信息
← 返回目录