file_put_contents()记录错误工作正常 - 除了致命错误

时间:2013-05-19 05:29:19

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

所以我想出了如何生成我自己的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函数也会因同时发生错误而失败。

为什么fatal_handler会出现这些错误,而常规错误处理程序却没有? 记录致命错误时,我必须做些什么?

E D I T:

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

我的问题再次提出: 为什么file_put_contents()在常规错误处理程序上工作但在致命错误处理程序中不起作用?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

找到它了!

而且我以为我已经尝试过了,但我昨天一定太累了 - 因为我犯了错误。

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

  

/家庭/网络/ 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;

然后它会工作! : - )