500 错误排查指南
快速诊断
- 运行诊断脚本
``bash
php diagnose500.php
</code>`<code>
或通过浏览器访问:</code>http://your-domain.com/diagnose500.php`
- 检查错误日志
- 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 文件不存在或配置错误
解决:
- 复制
env.example为.env - 根据实际情况修改配置
- 确保
.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;
}
调试步骤
- 启用错误显示(临时)
``php
errorreporting(EALL);
iniset('displayerrors', '1');
iniset('logerrors', '1');
iniset('errorlog', DIR . '/logs/php_errors.log');
``
- 检查错误日志
``bash
tail -f logs/error_*.log
tail -f /var/log/apache2/error.log # Apache
tail -f /var/log/nginx/error.log # Nginx
``
- 逐步测试
- 先测试 diagnose_500.php
- 再测试简单的 PHP 文件
- 最后测试完整的应用
- 检查依赖
``bash
composer install --no-dev
composer dump-autoload
``
生产环境最佳实践
- 关闭错误显示
``php
iniset('displayerrors', '0');
iniset('logerrors', '1');
``
- 配置错误日志
``php
iniset('errorlog', DIR . '/logs/php_errors.log');
``
- 设置适当的文件权限
- 目录: 755 - 文件: 644 - 可写目录(cache, logs): 755 或 775
- 使用环境变量
- 创建 .env 文件
- 不要提交 .env 到版本控制
- 使用 env.example 作为模板
- 定期检查日志
``bash
tail -f logs/error_*.log
``
获取帮助
如果以上方法都无法解决问题:
- 运行
diagnose_500.php并保存完整输出 - 检查错误日志的最后 50 行
- 检查 Web 服务器错误日志
- 提供 PHP 版本、Web 服务器类型和错误信息