在CentOS 7上,PHP中的file_put_contents无法打开流。

5

我知道这是许多线程中常见的错误,但我已经厌倦了搜索,仍然没有解决它。当我尝试运行函数file_put_contents时,会出现以下错误:

Warning: file_put_contents(test.txt): failed to open stream: Permission denied in /var/www/html/nurses/adminWriter.php on line 29

我已经尝试过最常见的方法,将nurses文件夹和test.txt文件的权限更改为777,但这并没有起作用。

我目前正在最新版本的CentOS 7服务器上进行全新安装。

我发现如果通过控制台运行php脚本:

# php /var/www/html/nurses/adminWriter.php

它能够很好地工作,只有在通过浏览器运行时才会出现错误,但我确实需要以这种方式运行。

最好的祝愿!


1
当您通过Apache运行PHP脚本时,它将作为指定的用户(通常是“apache”)运行。当您通过控制台运行PHP脚本时,它将作为您登录的用户运行。确保“apache”(或其他用户)可以访问该文件(包括任何父目录)。此外,您可以尝试使用绝对路径来访问test.txt--您可能正在尝试写入您没有预期的位置。 - jedwards
你是故意跳过引号的吗?试试这样写:file_put_contents(__DIR__ . '/test.txt'); - alfallouji
你是指像这样做吗:# chown -R apache:apache /var/www/html/nurses/ - danielnovais92
是的,我正在执行以下操作:file_put_contents('teste.txt','这是我的内容');已经尝试使用文件的完整路径和a('/var/www/html/nurses' . 'teste.txt')。 - danielnovais92
你评论中的代码缺少一个斜杠:'/var/www/html/nurses/'.'teste.txt' - jedwards
是的,但仍然没有运气。 - danielnovais92
2个回答

20
chcon -Rv --type=httpd_sys_rw_content_t /dir

这可能会有所帮助,而不是关闭selinux。


3
请问您能说明这是做什么用的吗? - Mike
在运行chcon之前,请感谢aureport -a。 {{{ 24. 09-10-2017 16:25:31 httpd system_u:system_r:httpd_t:s0 2 file read unconfined_u:object_r:user_home_t:s0 denied 923 25. 09-10-2017 16:26:42 httpd system_u:system_r:httpd_t:s0 2 file read unconfined_u:object_r:user_home_t:s0 denied 924 26. 09-10-2017 16:29:38 httpd system_u:system_r:httpd_t:s0 2 file read unconfined_u:object_r:user_home_t:s0 denied 925 }}} - Sérgio
这个对我有用。在工作了多个小时后,您节省了我的时间。使用sudo chcon -Rv --type=httpd_sys_rw_content_t /dir - Vara

7

好的,我找到了问题:selinux

以下是解决方案: http://kb.sp.parallels.com/en/11142

如果页面无法打开:

症状

当您将默认目录更改为存储网站内容的目录(例如“/ home”)时,无法通过Web访问子域和其他网站的内容。

原因

如果SELinux在“执行”模式下工作,则会出现此问题。在此模式下,网站和其中的子域的webroot目录具有不同的权限,并且您的Web服务器无法访问它们。运行此命令:

# getenforce

输出应该是:强制 解决方法 禁用 SELinux 支持:打开任何编辑器中的文件 /etc/selinux/config 并找到此行:
SELINUX=<value>

将其更改为:
SELINUX=disabled

如果您找不到这个文件,请在任何编辑器中打开文件/boot/grub/grub.conf,并向Grub引导加载程序添加参数selinux=0
title SE-Linux Test System
root (hd0,0)
kernel /boot/vmlinuz-2.4.20-selinux-XXXXXXXXXX ro root=/dev/hda1 nousb selinux=0
#initrd /boot/initrd-2.4.20-selinux-XXXXXXXXXX.img

重新启动服务器以应用更改。 如果您不想重新启动,请运行此命令:

# setenforce 0

1
禁用SELinux并不推荐。有更好的方法来处理它。 - Ilia
2
@Ilia Rostovtsev 我也遇到了同样的问题,禁用SELinux解决了它,有没有其他更好的方法可以在不禁用SELinux的情况下解决这个问题? - technomage
@IliaRostovtsev,“更好的方法”是什么? - emmdee
那是多年前的事了,我现在无法确切地记得我当时是如何解决这个问题的,但我确定我应用了规则和/或改变了上下文。与此处描述的类似:https://dev59.com/Bobca4cB1Zd3GeqPRhtv#27501934 - Ilia
奇怪,我不知道SELINUX是什么,也不知道为什么不建议禁用它,但除此之外,在我的情况下这个解决方案非常有效。 - Zain Ul Abidin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接