我试图让我的php cgi进程从我的文件系统上的文件读取。该文件和父文件夹都具有所有允许的rwx权限,并且该文件具有与php进程相同的所有者和组id, www-data。
无论我如何尝试打开文件(read(), file_get_contents(), stream_get_contents()),我总是得到相同的错误:failed to open stream: Permission denied
在php交互式会话中打开文件,在命令行中使用cat或使用python都没有问题。
怎么回事?
我以前在启用SELinux的Linux系统上看到过这个问题。httpd进程通常有自己的安全上下文,只允许访问特定的文件。
您可以通过在文件和php脚本上运行ls --scontext
来检查SELinux是否已启用。如果两个文件具有相同的上下文,或者如果ls
抱怨参数,那么SELinux可能不是问题的原因。
假设SELinux是问题的原因,那么您可以尝试使用chcon
命令将有问题的文件设置为具有与php脚本相同的安全上下文。例如:
chcon --reference=/var/www/html/page.php /data/filetoread
其中/var/www/html/page.php
是你的php脚本,/data/filetoread
是你想要访问的文件
原来这个文件是在一个FUSE文件系统下,没有使用allow_other
选项挂载。