file_put_contents()可以很好地记录错误——除了致命错误


file_put_contents() to log errors works fine - EXCEPT for fatal errors

因此,我想出了如何生成自己的PHP错误处理程序并将所有错误记录在日志文件中-用户不可见。我甚至做了第二个日志文件,只记录唯一的错误。

现在我知道如何处理致命错误了,通过调用register_shutdown_function (fatal_handler);

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

但是事情就在这里变得奇怪了:当我调用一个致命错误时,我从错误记录函数中得到了所有这些错误:

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

警告:file_put_contents(errors.log):打开流失败。不允许操作

警告:fopen(unique_errors.log): failed to open stream: Operation不允许

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

为什么fatal_handler会出现这些错误,而常规错误处理程序不会出现这些错误?在记录致命错误时,我需要做哪些不同的事情?

E D I T:

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

我的问题是 为什么file_put_contents()在常规错误处理程序上工作,而不是在致命错误处理程序中工作?

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

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

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

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

找到了!

我想我已经试过了,但是我昨天一定是太累了——因为我写错了。

我的一个可访问目录是:

/home/www/USER_ID/html/

我的日志文件位于

/home/www/USER_ID/html/MYSITE/文件夹/errors.log

触发错误的文件是

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

错误处理程序的函数包含在

中的文件中

/home/www/USER_ID/html/MYSITE/文件夹/errorshandlers.php

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

$file = SUBFOLDER/errors.log;

但是对于致命错误处理程序,我必须写

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

那就行了!: -)