11

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

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

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

4

5 回答 5

14

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

cd "My working file location"
ls -l .

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

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

tail -f /var/log/apache2/error.log
于 2013-02-15T18:17:02.243 回答
2

我最近遇到了同样的麻烦,偶然发现了这个问题。不幸的是,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,你应该可以写文件了。

于 2017-01-14T02:08:16.307 回答
0

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

于 2017-08-13T02:12:34.957 回答
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);
于 2020-04-05T04:10:51.987 回答
-3

您是否尝试过 chmodding 目录777

尝试这个:

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

可能拼错了什么。^

于 2013-02-15T20:12:30.247 回答