【问题标题】:php return 500 error but no error logphp返回500错误但没有错误日志
【发布时间】: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 存储库

标签: php apache logging error-handling


【解决方案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】:

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

    1. 运行 Apache 的用户无权修改 php_error_log 文件。
    2. 由于.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 用于冲突代码。我在我的代码中发现了类似的东西 但是解决了。

                【讨论】:

                  猜你喜欢
                  • 2019-09-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-08-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多