我最近遇到了同样的麻烦,偶然发现了这个问题。不幸的是,OP在评论中说,他找到了自己的解决方案,只是接受了一个对我们没有帮助的答案......然后在搜索并成功使file_put_contents再次工作后,我决定分享我的解决方案。
我的文件和目录的权限可以接受任何写入(确保您的目录是这样的,chmod 757
这将授予 root 和其他人在该位置写入文件的权限)。如果它仍然不能像我一样工作,那是因为您的系统可能是SELinux(安全增强 Linux)系统。
如果您想确保编写setenforce 0
这会将 selinux 转换为许可模式,请再次运行您的脚本,如果它有效,则表示问题已得到很好的描述。
在这种情况下,重新打开 selinux并在项目目录所在的目录中setenforce 1
尝试。ls -Zl
这会给你一个像
drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project
或者一些不同的东西,但httpd_sys_content_t
如果你曾经chcon
将上下文从一个目录转移到这个目录。但如果你没有httpd_sys_content_t
它也没关系,因为无论如何我们都需要更改该目录的上下文。
首先,您需要接受任何public_content_rw_t
上下文来写入文件。类型
setsebool -P httpd_anon_write on
这将(P)永久地将 SELinux 布尔值httpd_anon_write
设置为 true,并且任何被称为 as 的上下文public_content_rw_t
都将有权在其自己的位置写入任何文件。
现在你必须说你的项目目录是 SELinux,public_content_rw_t
否则你仍然无法写入文件。类型 :
semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
并restorecon -RvF /project
告诉selinux应用上述规范。
现在你的目录是public_content_rw_t,你应该可以写文件了。