【问题标题】:PHP - attempt to log using error_log() causes 500 errorPHP - 尝试使用 error_log() 记录会导致 500 错误
【发布时间】:2012-11-22 03:36:04
【问题描述】:

我有一个 IIS 服务器,它通过 fastcgi 为 PHP 提供服务。 当错误日志文件由 IIS_IUSRS 组(IIS 用户正在运行的组)中的用户以外的用户写入时,IIS 将无法写入该文件,并且 PHP 调用 error_log() 会导致 500 错误。 (至少这是我的猜测,好像我删除了日志文件,错误消失并且重新创建了日志文件)。

无论如何我可以阻止 500 错误的发生吗?

编辑:需要明确的是,我知道我可以通过停止记录、记录到事件日志或其他位置等来阻止这种情况,但这不是我的意思。我的意思是我只是想防止 500 错误,我不太关心我的系统无法记录它应该在尝试时破坏站点。这正是它可能发生的最糟糕的行为。我只是希望 500 错误不会发生并且网站继续工作。

【问题讨论】:

  • 除了 IIS 用户(PHP 在其下运行)之外,哪个用户会写入 error_log?在我看来,多个角色正在尝试写入该文件。其他哪些应用程序/用户正在写入 error_log 文件?
  • 有一个运行 PHP 的 cron 作业(或计划任务或任何 Windows 调用这些东西)也记录。我知道这是根本原因,正如我试图强调的那样,我不需要针对这种个别情况进行修复......我想知道如何防止 error_log 能够发出 500 错误,为用户关闭网站。这是一个日志功能,因此它无法写入日志文件,不应导致用户无法使用该网站。

标签: php iis permissions


【解决方案1】:

由于您的计划任务实际上是在更改错误日志文件的权限,所以我能看到的唯一可行选项是:

1) 使计划任务不写入error_log。将以下内容添加到 cron 作业的顶部:

error_reporting(E_NONE);

2) 通过在计划任务(PHP 文件)开始时发出以​​下命令,将计划任务写入系统日志(Windows 中的事件查看器):

ini_set('error_log', 'syslog');

3) 如果以上所有方法都不适合您,您可以尝试将任务安排为 IIS 用户/组。这将确保满足权限并且不再导致错误 500。

对此没有什么神奇的解决方法,您可以更改计划任务,使其具有与 PHP 进程相同的 UID/GID,或者您可以停止登录 schedule_task。

【讨论】:

    【解决方案2】:

    编辑php.ini,找到这一行并编辑:

    error_log = /your/website/path/to/log
    

    并确保将 display_errors 更改为关闭:

    display_errors = off
    

    记得把 chmod 777 放到文件中 :)。如果您想在浏览器中查看该文件,可以在 .htaccess 文件中添加如下内容:

    <Files /your/site/path/to/log/file.log>
        allow from 10.0.1.1/16
        deny from all
    </Files>
    

    PS:对不起,我没看到符号是 ISS 服务器...嗯,也许可以在 ISS 的 error_log 中查看有关错误的更多信息(我不知道在哪里)

    【讨论】:

    • 谢谢,但您完全没有抓住重点。我知道如何配置 php 来记录,如果无法记录,我想防止 500 错误。
    【解决方案3】:

    我经历过。您的 error_log 可能对于文件来说太大了。例如,当您的 error_log 达到 16mb 时,服务器将抛出错误 500。您可以删除您的 error_log 并尝试它是否仍然抛出该错误。您可能还想检查 error_logs 权限和所有权。

    【讨论】:

    • 哇 - 你超级没有阅读整个问题;)谢谢 - 但我知道如何“修复”它,这样它就不会在个别情况下发生。我想知道如何防止 error_log 出现 500 错误。它是一个日志功能,如果它失败了,它应该无法关闭整个站点。
    • @Kapitanluffy 关于 16MB 的日志大小......你说它就像是一个绝对规则,如果它发生在你身上,它可能可以在某个地方进行更改,因为我的日志现在是 17MB 并且我一点问题都没有
    【解决方案4】:

    您希望避免 error_log 函数引发 500 Internal Server Error!

    好吧,如果可能是这种情况,您是否尝试过在对 error_log 的调用前加上“@”。这可能会抑制错误。请尝试恢复! :)

    【讨论】:

      【解决方案5】:

      您可以尝试使用 error_log() 将您的应用程序日志写入替代路径:

      error_log("Some fancy error to log", 3, "c:\tmp\your-custom-errors.log");
      

      或者您可以配置 php 以记录到 Windows 事件日志(在您的 php.ini 中):

      error_log = syslog
      

      【讨论】:

      • 谢谢,但请查看我的编辑。我知道该怎么做,但这不是我想要问的……
      • 那听起来你需要将触发error_log的用户添加到IIS组中。
      • 仍然没有抓住重点。在任何情况下,我都不希望 error_log() 导致 500 错误。我不想考虑所有可能阻止它记录的情况。如果日志记录导致站点崩溃,那么它的设计就很糟糕。这不是用户关心的错误。
      • 你试过@error_log()吗?如果它不起作用,也许您可​​以编写自己的错误处理程序? php.net/manual/es/function.set-error-handler.php
      猜你喜欢
      • 1970-01-01
      • 2016-03-16
      • 2012-05-22
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多