Php 文件\u放置\u内容不创建txt文件

Php 文件\u放置\u内容不创建txt文件,php,linux,apache,centos,selinux,Php,Linux,Apache,Centos,Selinux,我目前有一个php脚本,当浏览器浏览网页时,它正在运行。我要做的是在脚本运行时编写一个文本文件来存储变量。文件夹的所有者是apache,但每个人都有读写权限,严格来说是为了测试。(我想这可能是权限问题)服务器上启用了SELINUX,当我从控制台运行脚本时,它会在正确的目录中创建文本文件 file_put_contents("My working file location", $myString); 我正在使用这一行尝试编写和创建文本文件,我知道我的文件位置可以工作,因为我可以在脱机模式下运行

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

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

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

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

cd "My working file location"
ls -l .
输出中有三列显示目录的权限、所有者和组。它们很可能由root所有,并且没有
apache
写入目录的权限

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

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

您是否尝试将目录命名为
777

试试这个:

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

可能是拼错了什么^

我最近也遇到了同样的麻烦,偶然发现了这个问题。不幸的是,OP在评论中说,他找到了自己的解决方案,只是接受了一个对我们都没有帮助的答案。。。然后,在搜索并成功地使文件内容再次生效后,我决定与大家分享我的解决方案

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

如果要确保write
setEnforce0
这会将selinux转换为许可模式,请再次运行脚本,如果脚本正常,则表示问题已得到很好的描述

在这种情况下,将selinux打开
setEnforce1
,然后在项目目录所在的目录中尝试
ls-Zl
。这会给你一条像这样的线

drwx---r-x.  9  root   root  system_u:object_r:httpd_sys_content_t:s0  4096  Dec  8  00:25  project
或者,如果使用
chcon
将上下文从一个目录传输到此目录,则使用不同的内容。但是如果您没有
httpd\u sys\u content\u t
,这没关系,因为我们需要更改该目录的上下文

首先,您需要接受任何
public\u content\u rw\u t
上下文来编写文件。类型

setsebool -P httpd_anon_write on
这将永久性地将(p)SELinux boolean
httpd\u anon\u write
设置为true,任何称为
public\u content\u rw\u t
的上下文都有权在自己的位置写入任何文件

现在您必须说SELinux您的项目目录是
public\u content\u rw\u t
,否则您仍然无法写入文件。类型:

semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
restorecon-RvF/project
告知selinux应用上述规范


现在,您的目录是public\u content\u rw\t,您应该能够编写文件。

我知道我的解决方案是否确实清晰,但它确实有效:

cd /mydir/
setsebool -P allow_httpd_anon_write true 

我也遇到了这个问题。在我的例子中,我发现目录的所有权是错误的。对于典型的Apache安装,目录应该由www-data:www-data拥有,而不是root:root。

对于有类似问题的人,可以尝试其他方法。您可能只是犯了一个简单的错误,不需要您乱弄文件权限,如果您犯了这个错误,修复文件权限可能没有帮助

确保您在file\u put\u contents()中使用的是本地相对文件路径

例如,使用:

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

而不是:

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

您的apache用户应该有目录权限-只需尝试以apache用户的身份从命令行执行脚本,以查看是否存在此问题。检查apache错误日志,它可能会向您提供有关失败位置的一些详细信息。$myString值是多少?对吗?您收到的错误消息是什么?我正在从浏览器运行它,它没有标记任何错误,或者更准确地说,我不知道在浏览器中从何处获取错误消息@user1914292我尝试了多个位置,包括apache的webroot是的所有者,所以我不确定这是否一定是问题所在@CooPer`$myString=strReplace(一个xml字符串),所以它只是一个字符串值。我修复了这个问题,它是selinux权限和apache权限的结晶。可以分享您的答案。谷歌将我重定向到这里,但我仍然被阻止。@VenderAeloth看起来这里的ChoppeyFireballs不是很活跃,但如果他没有回应,请确保在找到答案时与我们分享!我不确定这是否是解决问题的最佳方法,但我添加了以下内容:setsebool-P allow_httpd_anon_write true,当我需要写入文件时。@VenderAeloth只需添加一个答案,详细解释要执行的步骤。SELinux为什么要这样做?这看起来很愚蠢,因为在我的例子中,这是一个FPM过程,完全独立于网站写入,严格保护,没有用户输入路径。我不得不将777/667添加到文件夹中,这比允许攻击者写入文件夹更糟糕。我真的觉得这些人在设计SELinux的时候一定是在喷颜料,
file_put_contents('/whole/root/file/path/to/my_working_file.txt', $myString);