这个问题在这里被问过几次,但我还没有找到解决方案。我有一个Fedora 19 LAMP服务器,我只想运行简单的命令:file_put_contents('test.txt', 'Hello there');
,以确认我的Web服务器可以使用PHP将数据写入文件。我在找出合适的权限方案时遇到了麻烦。首先,Apache的文档根目录为/var/www/html
。此目录最初由名为www-data
的用户和组拥有,但我将目录的组更改为httpd进程所有者的主要组,名为apache
。这个所有者在PHP运行时处于活动状态。我已通过以下方式证实了这一点:
如您所见,流程所有者为apache
,当前目标为/var/www/html/php-console
。该目录由www-data
拥有,并且该组apache
的成员可以完全访问该目录。
我已尝试以下方法让PHP在这个位置实际创建一个文件,但无济于事:
chmod 777 /var/www/html/php-console
chown apache /var/www/html/php-console
chgrp apache /var/www/html/php-console
cd /var/www/html; > test.txt; chmod 777 test.txt;
从浏览器运行此脚本时,什么都不起作用。但是,当我在PHP CLI中使用file_put_contents
时,它就像我期望的那样工作,只要我输入命令的用户或其组具有对此目录或测试文件的写权限。
因此,从命令行中,您可以看到www-data
对我所在文件夹的读取,写入和执行权限。posix_getpwuid
和posix_geteuid
可帮助您找到Apache / PHP进程的所有者,在这种情况下与登录控制台的用户相同。 file_put_contents
成功地将8个字节写入指定的文件。如果我将组或所有者和组更改为其他内容,我会被拒绝,这绝对有意义。
如果这在命令行上有效,那么为什么不在我真正想要的时候,即在实际提供网页时呢?
答案 0 :(得分:1)
因为您忘记阅读httpd_selinux(8)
手册页并为目录提供适当的文件上下文以允许Web服务器在那里写文件。