php返回500错误但没有错误日志

Posted

技术标签:

【中文标题】php返回500错误但没有错误日志【英文标题】:php return 500 error but no error log 【发布时间】:2011-11-01 05:14:21 【问题描述】:

当我的 php 应用程序返回内部服务器错误 (500) 但错误日志中没有显示任何内容时,我遇到了问题。

现在我知道我正在尝试运行的内容有错误,我知道我丢失了一些文件,但没有但应该在 apache 错误日志中显示一些内容(否则我应该如何确切知道我缺少什么) .

我创建了一个测试脚本,它在相同的 vhost 配置下出现错误,并且这些错误显示正常,因此就 php/apache 而言,一切似乎都配置正确。是否有某些 php 错误确实显示在错误日志中(php 被配置为显示任何类型的通知、警告、错误、致命错误等...)?

这是在 ubunut 10.04 上使用标准 apache 和来自 ubuntu repo 的 php 和 apt-get 运行的。

【问题讨论】:

Apache 和 PHP 都来自带有 apt-get 的标准 ubuntu 存储库 【参考方案1】:

您需要启用 PHP 错误日志。

这是由于当您遇到 php 错误时 Web 服务器中的一些随机故障,它会引发 500 内部错误(我有同样的问题)。

如果您查看 PHP 错误日志,您应该会找到解决方案。

see here in the doc of how to enable it in the php.ini

【讨论】:

我认为您误解了这个问题。他的 PHP 错误日志已启用,但未记录此特定的 500 内部服务器错误。我现在在 Laravel 中遇到了这个问题,因为尝试访问私有方法会产生错误。记录了其他 500 个错误,但不是那个……不知道为什么:(【参考方案2】:

也许有些东西会关闭错误输出。 (我知道您是想说其他脚本正确地将错误输出到错误日志?)

您可以通过确定脚本的退出位置来开始调试脚本(首先在脚本的第一行添加echo 1; exit;,并检查浏览器是否输出1,然后将该行向下移动)。

【讨论】:

【参考方案3】:

扫描您的源文件以查找@

From php documentation site

目前“@”错误控制运算符前缀甚至会禁用 将终止脚本的严重错误的错误报告 执行。除其他外,这意味着如果您使用“@” 抑制某个功能的错误,或者它不可用 或者被打错了,脚本会死在那里,没有 说明原因。

【讨论】:

就是这样。 CodeIgniter 显然喜欢在框架中使用这些,这是我不喜欢 CodeIgniter 的另一个原因。 这正是。就我而言,CodeIgniter 的return @mysql_connect(... 掩盖了我未能在新服务器上安装 php 的 mysql 模块的事实。愚蠢的我,浪费时间,吸取教训。 @LucM 对于像 CodeIgniter 这样的东西说起来容易做起来难。由于它们也用于 cmets,因此有数千个 @ 符号散布在它们的代码库中。因此,不加选择地删除 @ 的建议实际上是没有用的。也许这里的教训是不要使用 CodeIgniter。 @Jake 大多数 IDE 允许在查找和替换中使用正则表达式,也可以在路径中查找。所以一点也不无用。 @MichaelHanon 正如我在 5 月 7 日的评论中提到的那样,在 CodeIgniter 中散布着成千上万个 @ 符号,因此单独验证每个搜索和替换结果是不可行的,即使是这样的过程仍然是由于数量庞大,容易出错。正如您所指出的,它们的存在一定是有原因的,所以最好的建议可能不是将它们全部删除。【参考方案4】:

过去,我在两种情况下没有错误日志:

    运行 Apache 的用户无权修改 php_error_log 文件。 由于.htaccess 的错误配置而发生错误500,例如错误的重写模块设置。在这种情况下,错误会记录到 Apache error_log 文件中。

【讨论】:

【参考方案5】:

以下是错误可能不可见的另一个原因:

我遇到了同样的问题。就我而言,我从生产环境中复制了源代码。因此index.php 中定义的ENVIRONMENT 变量被设置为'production'。这导致 error_reporting 设置为 0(无日志记录)。只需将其设置为'development',您就会开始在 apache 日志中看到错误消息。

原来 500 是由于数据库配置中缺少分号 :-)

【讨论】:

【参考方案6】:

发生在我身上的另一种情况是,我对我的一些页面进行了 CURL,然后出现内部服务器错误,并且 apache 日志中没有任何内容,即使我启用了所有错误报告。

我的问题是在我设置的 CURL curl_setopt($CR, CURLOPT_FAILONERROR, true);

然后没有显示我的错误,虽然有一个错误,但发生这种情况是因为错误发生在框架级别而不是 PHP 级别,所以它没有出现在日志中。

【讨论】:

【参考方案7】:

对于 Symfony 项目,请务必检查项目的应用程序/日志中的文件

更多详情请参阅此帖子:How to debug 500 Error in Symfony 2

顺便说一句,其他框架或 CMS 也有这种行为。

【讨论】:

【参考方案8】:

确保您的文件权限正确。如果 apache 没有读取文件的权限,那么它就无法写入日志。

【讨论】:

无论操作系统如何,Apache 都应该已经拥有 root 权限,因此应该能够写入任何文件,更不用说它自己的日志文件了。 没有 Apache 永远不应该拥有 root 权限。这将是严重的安全漏洞。【参考方案9】:

将以下内容复制并粘贴到新的.htaccess 文件中,并将其放在您网站的根文件夹中:

php_flag  display_errors                  on
php_flag  display_startup_errors          on

错误将直接显示在您的页面中。

这是快速调试的最佳方式,但不要长时间使用它,因为这可能会导致安全漏洞。

【讨论】:

这完全破坏了我的网站 - 运行 PHP 7.4。 在这种情况下,您的问题可能出在上游@HerrimanCoder(如 500 错误),因此,请转到您的 /var/log/apache2/error.log 并查看其中的内容。【参考方案10】:

如果您仍然有 500 错误并且没有日志,您可以尝试从命令行执行:

php -f file.php

它不会像在浏览器中(来自服务器)一样工作,但如果您的代码中存在语法错误,您将在控制台中看到错误消息。

【讨论】:

【参考方案11】:

当这是一个问题时,我发生的事情是该站点使用了太多内存,所以我猜测它无法写入错误日志或显示错误。为了清楚起见,这是一个 Wordpress 网站。提高服务器上的内存限制再次显示该站点。

【讨论】:

【参考方案12】:

已解决 我为此苦苦挣扎,后来,我意识到我正在开发 PHP 5.6,所以我升级到 PHP 7.0,然后我发布了 放置的 cmets git 用于冲突代码。我在我的代码中发现了类似的东西 但是解决了。

【讨论】:

以上是关于php返回500错误但没有错误日志的主要内容,如果未能解决你的问题,请参考以下文章

乘客配置重启应用程序返回 500 内部错误,没有任何错误日志条目

tomcat500没有错误日志

win server 2008 r2 iis+php 500错误内部服务器错误。

HTTP 500内部服务器错误怎么解决。

Laravel发布路由返回错误500

Nginx+PHP框架laravel状态码500错误解决!