php - 记录错误的 file_put_contents() 工作正常 - 除了 fatal error

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

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

现在我想出了如何解决 fatal error ,通过调用
register_shutdown_function('fatal_handler');

我的 fatal_handler 使用了我的常规错误处理程序使用的相同功能,因此 fatal error 以完全相同的方式记录。

但这就是事情变得奇怪的地方:当我调用一个 fatal error 时,我会从我的错误记录函数中得到所有这些错误:

WARNING: file_put_contents(): open_basedir restriction in effect. File(errors.log) is not within the allowed path(s): ...

WARNING: file_put_contents(errors.log): failed to open stream: Operation not permitted

WARNING: fopen(unique_errors.log): failed to open stream: Operation not permitted



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

为什么这些错误发生在 fatal_handler 而不是常规错误处理程序?
记录 fatal error 时,我必须做些什么不同的事情?


编辑:

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

所以又是我的问题:
为什么 file_put_contents() 在常规错误处理程序中有效,但在 fatal error 处理程序中无效?

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

最佳答案

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

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

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

关于php - 记录错误的 file_put_contents() 工作正常 - 除了 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16631737/

相关文章:

php - Laravel:获取复选框的值

android - 错误 A/libc : Fatal signal 11 (SIGSEGV) at 0x00000018 (code=1) in SkPath

php - 获取日期时间格式之间的持续时间

php - 从 sql 表填充选择框时出现错误值

php - mysql 在插入唯一记录时出错会在第一个错误时终止 foreach 循环吗?

error-handling - 你如何在 Rust 中定义自定义 `Error` 类型?

symfony - 如何避免终端捕获错误而不是Symfony探查器

Android RunTimeError : Java. lang.RunTimeException:无法实例化 Activity

php - MySQL fatal error

php - 在一个 MySQL 列中插入多行时出现问题 - PHP