所以我想出了如何生成我自己的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的内部工作一无所知......有没有人有意见或想法?
答案 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;
然后它会工作! : - )