当前位置:首页 >  IDC >  服务器 >  正文

PHP 500 错误定位四步:日志、开关、堆栈、复现

 2026-09-04 11:18  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

500 和 502 的差别,一句话说清:502 是 Nginx 拿不到上游响应,500 是 PHP 自己跑着跑着崩了,然后把这个错误码一路传回浏览器。所以 500 的现场一定在 PHP 侧,去 Nginx 的 error.log 里翻是找不到的。

第一步,确认错误到底出在哪一层。curl 拿状态码只是看到表象,真正的判断依据是响应头里有没有 X-Powered-By 这类 PHP 打的标记,以及 Nginx error.log 里有没有对应的 upstream 报错。两边都没有,那基本就是 PHP 层自己返回了 500。

第二步,把错误显示开关打开。生产环境的 display_errors 默认是 Off,这是对的,不能让访客看到你的文件路径和报错细节。排查时临时改 php.ini 或者用 ini_set 打开,同时确认 log_errors 是 On,错误会写进 error_log 指定的文件。

这里有个细节值得注意:FPM 池配置里可以用 php_admin_value 覆盖 php.ini 的设置,而且 php_admin_value 的优先级更高、无法被脚本里的 ini_set 覆盖。如果你在 php.ini 里改了半天没反应,去池配置里看看是不是被 php_admin_value 顶掉了。

第三步,从日志里定位到具体文件和行号。PHP 的报错格式很规整,Fatal error 后面跟着文件路径和行号,再后面是出错的函数调用。有行号就好办了,直接打开文件看那一行在干什么——绝大多数情况是调用了不存在的函数、数组下标越界、或者 require 了一个不存在的文件。

<?php
// 500 排查期临时诊断脚本:只在排障时放上去,用完立刻删
// 放到网站根目录,浏览器访问 diagnose.php 查看真实报错

// 打开全部错误输出
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('log_errors', '1');
ini_set('error_log', __DIR__ . '/php_error.log');

// 打印当前生效的关键配置,确认有没有被 php_admin_value 覆盖
$keys = ['display_errors', 'log_errors', 'error_log',
'memory_limit', 'max_execution_time', 'error_reporting'];
foreach ($keys as $k) {
printf("%-22s = %s\n", $k, var_export(ini_get($k), true));
}

// 记录当前加载的配置文件路径,避免改错文件
echo "Loaded ini: " . php_ini_loaded_file() . "\n";

// 故意触发一个错误,验证错误是否真的能被看见
trigger_error("diagnose: 这是一条测试错误", E_USER_WARNING);

第四步,做最小复现。日志告诉你哪一行错了,但不一定告诉你为什么错。把那段逻辑抽出来,写个十行的独立脚本单独跑,能复现就说明问题在逻辑本身,复现不了就要考虑是上下文的差异——变量值、数据库内容、文件权限,这些都可能导致同样的代码在不同环境下表现不同。

踩过一次坑之后我养成个习惯:诊断脚本用完当场删掉。这类文件留在根目录上,等于把服务器路径、PHP 版本、配置细节全亮给外人看,被扫描器抓到就是白送的信息。排查完记得把 display_errors 也改回 Off。

还有一类 500 查起来特别费劲,因为它只在特定请求下出现——比如某个插件在处理特定数据时才崩。这种时候别硬猜,去翻 PHP 的慢日志和 FPM 日志,把出问题的请求特征抓出来,再用同样的参数去复现。没有复现路径的排查,基本等于碰运气。

 

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
网站服务器
php教程

相关文章

  • Nginx 504 Gateway Timeout:超时链路上每一环怎么查

    504和502经常被混为一谈,但两者的含义差得远。502是Nginx压根联系不上上游,504是联系上了、请求也发过去了,可上游迟迟不回话,Nginx等不下去了。换句话说,502是后厨关门了,504是后厨开门营业,只是做菜太慢。这个区别决定了排查方向完全不同。502查的是上游在不在,504查的是上游为

    标签:
    网站服务器
  • Nginx 502 Bad Gateway:从 PHP-FPM 到上游的四段排查

    502的全称是BadGateway,翻译过来叫坏网关。这个翻译其实挺误导人的,因为它让人以为网关坏了。真实情况是:Nginx好端端地在那儿,问题永远出在它背后的上游服务,绝大多数时候就是PHP-FPM。搞清这一点,排查方向就不会跑偏。第一段,确认FPM还活着。systemctlstatusphp-f

  • 服务器故障排查总纲:按现象反查的五层定位法

    网站挂了的那一刻,绝大多数人的第一反应是重启。重启Nginx、重启PHP、实在不行重启服务器。这套动作有一半概率管用,但管用的那一次你也不知道为什么管用。下次它还会来,而且大概率挑你最忙的时候来。我后来给自己定了条规矩:不管什么故障,都按固定的五层顺序往下查,每层只用一两条命令确认是或不是,绝不跳层

  • 服务器安全基线审计:Lynis一条命令查出你的薄弱项

    服务器被入侵一次,站长往往才知道安全配置有多重要。问题是Linux安全配置分散在SSH、防火墙、内核参数、文件权限、软件包等几十个地方,人工逐项检查不现实。Lynis就是专门解决这个问题的自动化审计工具。Lynis3.1.7是2026年6月发布的版本,包含448多项检查、39个安全领域,跑完会给出一

    标签:
    网站服务器
  • AI生成的代码别直接上线——OWASP安全审查清单请收好

    AI写代码的毛病很一致:能用,但不安全。它优化的是“能不能跑通”,不是“扛不扛得住攻击”。OWASP专门给AI生成的代码排了个十大风险榜,排前面的就是注入、认证失败、安全配置错误、脆弱依赖、SSRF、日志缺失——全是老熟人,只是AI把它生产得更快了。最典型的是SQL注入。AI从训练数据里学到的老代码

    标签:
    AI编程
    php教程

热门排行

信息推荐