因此,我想出了如何生成自己的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
那就行了!: -)