Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 记录错误的文件\u put\u contents()工作正常-致命错误除外_Php_Error Handling_Fatal Error_Error Logging - Fatal编程技术网

Php 记录错误的文件\u put\u contents()工作正常-致命错误除外

Php 记录错误的文件\u put\u contents()工作正常-致命错误除外,php,error-handling,fatal-error,error-logging,Php,Error Handling,Fatal Error,Error Logging,因此,我想出了如何生成自己的PHP错误处理程序,并将所有错误记录在日志文件中——用户不可见。我甚至制作了第二个日志文件,只记录唯一的错误 现在我通过打电话找到了解决致命错误的方法 寄存器\关闭\函数(“致命\处理程序”) 我的致命错误处理程序使用的函数与常规错误处理程序使用的函数相同,因此致命错误的记录方式完全相同 但这里是事情变得奇怪的地方:当我调用致命错误时,我从错误日志函数中得到所有这些错误: 警告:文件\u put\u contents():打开\u basedir限制生效。 文件(er

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

现在我通过打电话找到了解决致命错误的方法 寄存器\关闭\函数(“致命\处理程序”)

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

但这里是事情变得奇怪的地方:当我调用致命错误时,我从错误日志函数中得到所有这些错误:

警告:文件\u put\u contents():打开\u basedir限制生效。 文件(errors.log)不在允许的路径内:

警告:文件内容(errors.log):无法打开流: 不允许操作

警告:fopen(unique_errors.log):无法打开流:操作 不允许

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

为什么致命错误处理程序会发生这些错误,而常规错误处理程序不会发生这些错误? 在记录致命错误时,我必须采取哪些不同的措施?

E-D-it:

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

我的问题是: 为什么file\u put\u contents()在常规错误处理程序中有效,而在致命错误处理程序中无效?


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

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

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

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

找到它

我想我已经试过了,但我昨天肯定太累了——因为我把它弄错了

因此,我的一个可访问目录是:

/home/www/USER\u 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=子文件夹/errors.log

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

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


那就行了!:-)

你至少试过用谷歌搜索OpenU basedir吗?我确实发现有一种方法可以改变这些限制。。。但我的问题是,为什么我需要为致命错误处理程序更改它,而它对常规错误处理程序却可以正常工作?很抱歉,这没有帮助。。。当然,有一些目录限制在我的服务器上-我没有问题,我不试图访问它们。我试图访问允许目录中的文件(每次我都使用常规错误处理程序访问该文件)。只有当我尝试致命错误处理程序时,它才会说我不允许访问它。我不需要更改可访问的目录,因为我的文件位于可访问的目录中。