file_put_contents没有创建txt文件

时间:2013-02-15 18:06:48

标签: php linux apache centos selinux

我目前有一个浏览器浏览器浏览网页时运行的php脚本。我要做的是在运行存储变量的脚本时编写一个文本文件。该文件夹的所有者是apache,但每个人都有读写,严格用于测试目的。 (我认为这可能是一个权限问题)SELINUX在服务器上启用,当我从控制台运行脚本时,它创建文本文件就好了,并在正确的目录中。

file_put_contents("My working file location", $myString);

我正在使用此行尝试编写和创建文本文件,我知道我的文件位置正常工作,因为我可以运行它并在离线模式下创建它,I.E。通过控制台运行它。问题是我尝试编写的变量是通过HTTP Post填充的,当我通过浏览器运行脚本时,或者当apache运行脚本时,它不会写入或创建文件。我需要做什么才能允许访问写入/更改语法以使此脚本编写此文本文件?

6 个答案:

答案 0 :(得分:10)

您的问题可能是由于apache无权写入您指定的文件位置。转到该目录,使用ls命令检查权限和组所有权:

cd "My working file location"
ls -l .

输出中有三列显示目录的权限,所有者和组。很可能它们归root所有,并且没有apache写入目录的权限。

如果是这种情况,那么当您尝试创建文件时,您会在Apache日志中看到错误。在浏览器中运行脚本时尝试跟踪日志:

tail -f /var/log/apache2/error.log

答案 1 :(得分:2)

我最近遇到了同样的麻烦,偶然发现了这个问题。不幸的是,OP在评论中说他找到了自己的解决方案并接受了一个对我们任何人都没有帮助的答案......然后经过搜索并成功使 file_put_contents 再次工作我决定分享我的解决方案。

我的文件和目录的权限可以接受任何写入(确保您的目录为chmod 757这将为root和其他授予在该位置写入文件的权限) 。如果它仍然没有像我那样工作,那是因为您的系统可能是 SELinux (安全增强型Linux)系统。

如果你想确保写setenforce 0这会将selinux变为许可模式,再次运行你的脚本,如果它有效,那就意味着问题得到了很好的描述。

在这种情况下,请在背面setenforce 1上转动selinux,并在项目目录所在的目录中尝试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)ermanently SELinux布尔httpd_anon_write设置为true,任何被称为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 ,你应该可以写文件了。

答案 2 :(得分:0)

我也遇到了这个问题。就我而言,我发现目录的所有权是错误的。对于典型的Apache安装,目录应归www-data所有:www-data,而不是root:root。

答案 3 :(得分:0)

对于有类似问题的人,还有其他尝试。您可能只是犯了一个简单的错误,不需要弄乱文件权限-如果您犯了这个错误,则修复文件权限可能无济于事。

确保在file_put_contents()中使用本地的相对文件路径。

例如,使用:

file_put_contents('short_local_path/my_working_file.txt', $myString);

不是:

file_put_contents('http://example.com/remote_path/my_working_file.txt', $myString);

不是:

file_put_contents('/whole/root/file/path/to/my_working_file.txt', $myString);

答案 4 :(得分:-1)

我要确定我的解决方案是否非常明确但是有效:

cd /mydir/
setsebool -P allow_httpd_anon_write true 

祝你好运

答案 5 :(得分:-2)

您是否尝试过将目录修改为777

试试这个:

if(file_put_contents('file.txt', 'text')){
    die('yes');
} else {
    die('no');
}

可能会拼写错误的东西。 ^