PHP:fopen()权限被拒绝

时间:2010-10-07 13:45:01

标签: php permissions

我对此代码感到困惑:

test.php的:

fopen('test.txt','a+');

当我执行它时,我收到一个错误:

Warning: fopen(test.txt): failed to open stream:
     Permission denied in /var/www/html/yuelu3/mobile/text.php on line 2

的test.txt:

-rwxrwxrwx. 1 jt jt     87 10月  7 20:58 test.txt

问题出在哪里?

非常感谢!我发现了问题,我使用FC13,因为SELinux的保护,一些动作被拒绝。所以,我只需要摆脱保护。

8 个答案:

答案 0 :(得分:15)

This issue can also be a result of having SELinux enabled. This can be solved using:

chown -R apache:apache /var/www/html/directory_to_write
chcon -R -t httpd_sys_content_t /var/www/html/directory_to_write
chcon -R -t httpd_sys_rw_content_t /var/www/html/directory_to_write

You can find more about the contexts at https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server-Types.html

答案 1 :(得分:13)

fopen('/path/to/file/test.txt','a+');

作为

fopen('test.txt','a+');

最有可能在另一个目录中查找

答案 2 :(得分:8)

我一直收到同样的错误"无法打开流。权限被拒绝"尝试使用PHP在服务器上编写文件时。 我尝试了互联网上的所有内容来修复错误。我将服务器上的文件,目录和子目录的所有权更改为" apache",我做了一个" chmod 777"在所有的文件,目录,子目录上,我跑了" restorecon -R",我跑了" chcon unconfined_u:object_r:httpd_user_content_t:s0"在所有文件上,但唯一可行的是完全关闭SELinux。

我终于解决了这个问题。问题在于SELinux使用的布尔参数。 我执行了以下命令来获取与httpd。

相关的所有布尔值的列表

$ getsebool -a | grep httpd

这列出了大约36个参数。

我痛苦地使用setsebool命令打开每个布尔值,直到"无法打开流。许可被拒绝"错误消失了。

当我转身" on" httpd_unified布尔值,错误消失!! 当我把它关掉时,错误就回来了!!

答案 3 :(得分:6)

使用fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

答案 4 :(得分:4)

尝试打开文件时,路径始终会导致问题。尝试打开文件时避免出现任何问题的简单方法是检查您所在的目录以及拨打电话的位置。

echo getcwd();

创建一个简单的PHP页面并打电话打印当前目录。将PHP页面放到与该文件相同的目录中,它将告诉您该文件夹的正确路径,然后只需添加/filename.xxx。

答案 5 :(得分:4)

检查文件的SELinux上下文模式以确保它设置为:httpd_user_content_t

......如果不是,请使用:

chcon httpd_user_content_t test.txt

...纠正问题。

答案 6 :(得分:0)

我正在使用Apache HTTP服务器v2.4,我认为以下方法适用于Linux上的大多数人:
首先检查谁是运行“ httpd”的用户。
就我而言,是daemon,但我不确定是否每个人都适用。 您可以使用:
ps -ef | grep 'httpd'

一旦您确定用户daemon是进程httpd的所有者,请更改要向其写入deamon的权限的文件夹的所有者

sudo chown daemon /path/to/folder

这只会更改用户,该目录的组保持不变。 如果您希望该组也能够写,请确保它具有写权限

sudo chmod g+w /path/to/folder

答案 7 :(得分:0)

就我而言,这些步骤对我有帮助:

  • 使用此命令ps -ef验证流程用户
  • 结果可能是:
UID        PID  PPID  C STIME TTY          TIME CMD
www-data    18     1  0 15:43 pts/0    00:00:00 apache2 -DFOREGROUND
  • www数据用户添加为 / var / www / html / 文件夹的所有者
chown -R www-data:www-data /var/www/html/