2013-02-15 77 views
7

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

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

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

+1

Apache的用户应该有权目录 - 只是尝试执行脚本的命令行apache用户,看看是否能工作 – user1914292 2013-02-15 18:12:25

+2

检查Apache的错误日志,它可能给你一些细节的地方失败了。 – 2013-02-15 18:12:27

+0

什么是$ myString值?那是对的吗 ? – Cooper 2013-02-15 18:12:59

回答

9

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

cd "My working file location" 
ls -l . 

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

如果是这种情况,那么当您尝试创建文件时,您会在apache日志中看到一个错误。尝试拖尾你的日志运行脚本,而在你的浏览器:

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

我固定的问题,它是一个高潮selinux权限和apache权限。 – choppyfireballs 2013-02-15 18:28:13

+2

可以很好地分享您的答案。谷歌在这里重定向我,我仍然被阻止。 – 2015-06-02 14:10:28

+1

@VenderAeloth貌似choppyfireballs不是很活跃在这里,但他如果他不作出回应,那么要确保您与我们分享您的答案,当你找到它! – 2015-06-03 18:01:26

-2

您是否尝试过chmodding目录中777

试试这个:

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

魔法门的拼写错误的东西。^

+1

有时这是查看错误的好方法 – tofutim 2015-12-04 08:44:42

1

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

我的文件和目录的权限可以接受任何写入(请确保您的目录是chmod 757这会给根和其他授予在该位置写入文件)。如果它仍然无法正常工作,那是因为您的系统可能是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)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你应该可以写文件。

-1

我注意到肯定,如果我的解决方案非常清晰,但它的工作:

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

问候

0

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

+0

这不能提供问题的答案。一旦你有足够的[声誉](https:// stackoverflow。com/help/whats-reputation)你将能够[对任何帖子发表评论](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/17017422) – 2017-08-13 07:36:15