我有一个通过fastcgi服务PHP的IIS服务器。
当IIS_IUSRS组(IIS用户正在运行的组)中的用户写入错误日志文件时,IIS将无法写入该文件,并且对error_log()
的PHP调用将导致500错误。 (至少那是我的猜测,好像我删除了日志文件,错误消失并重新创建了日志文件)。
无论如何我可以阻止500错误发生吗?
编辑:要清楚我知道我可以通过停止记录,记录到事件日志或不同位置等来阻止这种情况,但这不是我的意思。我的意思是我只是想防止500错误,我不在乎我的系统无法记录它应该在尝试时破坏网站。这正是它可能产生的最糟糕的行为。我只是希望500错误没有发生,网站继续工作。
答案 0 :(得分:2)
由于您的计划任务实际上正在更改错误日志文件的权限,因此我能看到的唯一可行选项是:
1)使计划任务不写入error_log。将以下内容添加到cron作业的顶部:
error_reporting(E_NONE);
2)通过在计划任务开始时发出以下命令(PHP文件),使计划任务写入系统日志(Windows中的事件查看器):
ini_set('error_log', 'syslog');
3)如果以上所有方法都不合适,您可以尝试将任务安排为IIS用户/组。这将确保满足权限并且不再导致错误500。
对此没有神奇的解决方法,您可以更改计划任务,使其具有与PHP进程相同的UID / GID,也可以停止登录scheduled_task。
答案 1 :(得分:1)
修改php.ini,找到此行并修改:
error_log = /your/website/path/to/log
并确保将display_errors更改为off:
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:Sry,我看到符号是ISS服务器......哼,也许可以在ISS的error_log中查看有关错误的更多信息(我不知道在哪里)
答案 2 :(得分:1)
我经历过这个。您的error_log可能对文件来说太大了。例如,当您的error_log达到16mb时,服务器将抛出错误500.您可以删除您的error_log并尝试它是否仍然会抛出该错误。您可能也想检查error_logs权限和所有权。
答案 3 :(得分:1)
您希望避免error_log函数引发500内部服务器错误!
好吧,如果可能是这种情况,您是否尝试使用“@”将您的调用前置于error_log。这可能会抑制错误。请尝试还原! :)
答案 4 :(得分:0)
您可以尝试使用error_log()在备用路径中编写应用程序日志:
error_log("Some fancy error to log", 3, "c:\tmp\your-custom-errors.log");
或者您可以配置php以登录到Windows事件日志(在您的php.ini中):
error_log = syslog