【问题标题】:file_put_contents() to log errors works fine - EXCEPT for fatal errors记录错误的 file_put_contents() 工作正常 - 除了致命错误
【发布时间】:2013-05-19 05:29:19
【问题描述】:

所以我想出了如何生成我自己的 PHP 错误处理程序并将所有错误记录在日志文件中 - 对用户不可见。我什至制作了第二个日志文件,它只记录 UNIQUE 错误。

现在我想出了如何解决致命错误,方法是调用 register_shutdown_function('fatal_handler');

我的 fatal_handler 使用了与我的常规错误处理程序相同的函数,因此致命错误的记录方式完全相同。

但事情变得很奇怪:当我调用一个致命错误时,我会从我的错误记录函数中得到所有这些错误:

警告:file_put_contents():open_basedir 限制生效。 文件(errors.log)不在允许的路径中:...

警告:file_put_contents(errors.log):无法打开流: 不允许操作

警告:fopen(unique_errors.log):无法打开流:操作 不允许

随后任何 fgets、fclose 和 file_put_contents 函数也会失败并出现类似错误。

为什么致命处理程序会出现这些错误,而常规错误处理程序不会出现这些错误? 记录致命错误时,我有什么不同的做法?

编辑:

*也许我应该提到,我尝试访问的日志文件位于 open_base_dir 限制错误消息作为选项列出的路径中的一个子文件夹中。所以这个错误没有意义,因为它在允许的路径之内——我的意思是,当它只是一个通知而不是一个致命错误时,它毕竟可以毫不费力地工作。*

我的问题又来了: 为什么 file_put_contents() 在常规错误处理程序中有效,而在致命错误处理程序中无效?

我假设我必须在致命错误处理程序中以不同方式指定文件的路径,因为事件发生在不同的级别或类似的东西可能......?我真的对php的内部运作一无所知...有人有意见或想法吗?

【问题讨论】:

  • 您是否至少尝试过 google open_basedir?
  • 我确实发现显然有一种方法可以改变这些限制......但我的问题是为什么我需要为致命错误处理程序更改它,当它适用于常规错误时处理程序?

标签: php error-handling fatal-error error-logging


【解决方案1】:

虽然 PHP 可执行文件默认可以访问很多地方。比如PHP的安装目录、日志文件所在的目录、php.ini、windows的临时目录等等……

您可以限制对运行脚本可以读/写的目录的访问。这是一种安全措施,因此即使某个 php 脚本存在漏洞,您计算机的其余部分也不会受到损害。这是通过 open_basedir 完成的。

我认为(我不确定)您可以在 open_basedir 中设置多个目录。但我的建议是不要设置 open_basedir 来访问 php.ini 所在的目录。因为在这种情况下,您不妨删除 open_basedir。

【讨论】:

  • 很抱歉,但这并没有帮助...当然,我的服务器上有一些目录受到限制 - 我对此没有任何问题,我也不想访问它们。我正在尝试访问允许目录中的文件(我每次都使用常规错误处理程序访问该文件)。只有当我尝试我的致命错误处理程序时,它才会说我不允许访问它。我不需要更改可访问目录,因为我的文件位于可访问目录中。
【解决方案2】:

找到了!

我以为我已经试过了,但我昨天一定是太累了——因为我把它弄错了。

所以我的可访问目录之一是:

/home/www/USER_ID/html/

我的日志文件位于

/home/www/USER_ID/html/MYSITE/SUBFOLDER/errors.log

触发错误的文件是

/home/www/USER_ID/html/MYSITE/index.php 并且所有其他触发错误的文件都在此文件旁边。

错误处理程序的函数包含在一个文件中

/home/www/USER_ID/html/MYSITE/SUBFOLDER/errorshandlers.php

对于常规错误处理程序,我可以将日志文件指定为

$file = SUBFOLDER/errors.log;

但对于致命错误处理程序我不得不说

$file = /home/www/USER_ID/html/MYSITE/SUBFOLDER/errors.log;

然后就可以了! :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多