如何让PHP对一个目录具有写入权限?

81

我试图使用PHP来创建一个文件,但是它没有起作用。我认为这是因为它没有写入权限(以前一直是问题)。我尝试通过将文件夹的chmod设置为0777来测试是否存在此问题,但结果导致该目录中的每个脚本都返回500错误信息,直到我改回来。
如何给PHP写入文件系统的权限以便创建文件?

编辑:它是在Hostgator共享托管上使用Apache托管的。

编辑2:有人要求代码:
代码是一个GD图像脚本。我知道其余部分工作正常,因为以前每次调用它时都会创建图像。现在我正在尝试在添加新文本并将其保存到文件夹时创建它们。我拥有的写入行是:
imagejpeg(null,$file,85);
我还创建了一个测试文件来检查它是否只是一个损坏的脚本(主要是从tizag复制):
http://gearboxshow.info/rkr/lesig.jpg/testfile.txt(我不知道是否/如何在此正确发布代码。这里是PHP脚本的内容,不包括PHP标记。)
它返回13,13,1(单独的行),所以看起来它认为它写了什么,但testfile.txt是空白的(我上传了一个空白的),或者不存在(如果我删除它)。

编辑3:服务器运行CentOS。


这是你控制的服务器还是你在共享服务器上? - webbiedave
Hostgator 共享主机。Apache。 - Leagsaidh Gordon
服务器运行的是什么操作系统?如果是Linux,您应该确保apache用户(确切的用户名将取决于您的设置-通常在Linux下为httpd或www-data)对目录具有写访问权限。您可以将所有者更改为与apache相同的用户(使用chown),并授予所有者写访问权限(例如“chmod 755”),或者您可以使其全局可写(例如“chmod 777”)。 - El Yobo
12
@El Yobo:不要将权限设置为777……请在chmod方面保持理性。 - Jan K.
12个回答

64

一个简单的方法是让PHP自己创建目录。

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
 }

 file_put_contents ($dir.'/test.txt', 'Hello File');

这可省去了您的权限麻烦。


2
没错。您可以修改权限以满足您的需求。 - favo
6
这是最简单的解决方案,尽管您不应在Apache上使用777,因为它配置为阻止那些文件。 - vdbuilder
8
创建目录时出现权限被拒绝的错误! - maxisme
假设您有在要创建myDir文件夹的目录中写入权限 - Randhir Rawatlal
您的解决方案显示权限被拒绝。这是显而易见的。 - vincent thorpe

46

简单的三步解决方案

摘要:您需要将目录的所有者设置为 PHP 使用的用户(Web 服务器用户)。


第一步:确定 PHP 用户

创建一个包含以下内容的 PHP 文件:

<?php echo `whoami`; ?>

将其上传到您的Web服务器。 输出应类似于以下内容:

www-data
因此,PHP用户是www-data

步骤 2:确定目录所有者

接下来,通过命令行检查 Web 目录的详细信息:

ls -dl /var/www/example.com/public_html/example-folder

结果应该类似于以下内容:

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder
因此,该目录的所有者是 exampleuser1

步骤 3:将目录所有者更改为 PHP 用户

随后,将 Web 目录的所有者更改为 PHP 用户:

sudo chown -R www-data /var/www/example.com/public_html/example-folder

验证 Web 目录的所有者是否已更改:

ls -dl /var/www/example.com/public_html/example-folder

结果应与以下类似:

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

因此,example-folder 的所有者已成功更改为 PHP 用户:www-data


完成!PHP现在应该能够写入该目录。


2
完全离题了,但没有其他方法来ping你:感谢您在Coffee SE上的勤奋标记工作! - Stephie
@Stephie 没问题! - Grant Miller
这对我来说完美地运作了。没有任何更改需要让我的PHP脚本找到可写目录。 - InvictusMKS
这个非常有效!这应该是被采纳的答案。 - Najeeb
请帮忙,这个不起作用。is_writable($directory) 仍然返回 false。 - vincent thorpe
显示剩余2条评论

38

将目录的所有者设置为运行apache的用户。在Linux上通常是nobody。

chown nobody:nobody <dirname>

这样,您的文件夹将不会对所有用户开放写入权限,但是对于Apache来说仍然可写入 :)


5
如果你使用的是Ubuntu,那么这个用户和组是不存在的。你有什么建议可以完成你在这里要做的事情吗? - Brandon Minton
20
“ chown www-data:www-data <dirname> ” 就可以了。在基于Debian的系统中,"www-data" 是 Apache 用户。 - Thomas Winsnes
@guitarlass,您需要将该命令放入bash/ssh窗口中。 - Thomas Winsnes
1
有时候我不明白权限方面的事情为什么会起作用或者不起作用,我很高兴这次它能够正常工作......太棒了。 - n0nag0n
@ThomasWinsnes 在Ubuntu 14.04上,www-data:www-data 对我仍然不可写。 - BadHorsie
显示剩余5条评论

10

首先使用以下命令确定哪个用户拥有httpd进程

ps aux | grep httpd

您将会得到类似于这样的多行回复:

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

第一列显示用户名。所以现在您知道正在尝试编写文件的用户,即在本例中是phpuser。 现在,您可以继续为您的PHP脚本尝试写入某些内容的目录设置权限:

sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere

现在你必须使用 ps aux | grep apache2 - Polluks
对不起,朋友,那对我没起作用。 - vincent thorpe
对不起,朋友,那对我没起作用。 - undefined

4

您可以将selinux设置为宽容模式以进行分析。

    # setenforce 0

Selinux会记录但允许访问。因此,您可以检查/var/log/audit/audit.log获取详细信息。也许您需要更改Selinux上下文。为此,您将使用chcon命令。如果需要,请向我们展示您的audit.log以获得更详细的答案。

解决问题后别忘了启用selinux。最好保持selinux强制执行。

    # setenforce 1

4
您可以使用PHP的chmod()函数更改文件夹的权限。有关如何使用该命令的更多信息,请参见此处:http://php.net/manual/en/function.chmod.php 如果将权限设置为777(全局可写),则会出现500错误,这意味着您的服务器设置防止执行此类文件。出于安全考虑,这样做。在这种情况下,您将希望将755用作文件的最高权限。
如果在执行PHP文档的文件夹中生成了一个error_log文件,则需要查看最后几个条目。这将使您了解脚本失败的原因。
对于PHP文件操作的帮助,我使用http://www.tizag.com/phpT/filewrite.php作为资源。

该文件夹已经默认设置为0755。 我从来没有想过要检查error_log,但我刚刚检查了一下,它并没有包含任何有关为什么无法生成文件的信息。 - Leagsaidh Gordon
把你遇到问题的代码发出来可能是个好主意。我偶尔会使用一个很好的资源来帮助处理文件处理程序语法,它就是http://www.tizag.com/phpT/filewrite.php。 - Ryan Gyure

4

我发现在HostGator上,您需要将文件设置为CMOD 644,文件夹设置为755。由于我是根据他们的技术支持这样做的,所以在HostGator上运行良好。


3

我遇到了同样的问题:

因为不想给我的php目录赋予0777权限,我创建了一个权限为0777的tmp目录,在其中创建需要写入的文件。

我的php目录仍然得到保护。如果有人攻击了tmp目录,网站将继续正常工作。


3

如何最好地给一个目录赋予写入权限..

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");

2

我正在运行Ubuntu,如上所述,nobody:nobody在Ubuntu上无法正常工作。你会收到以下错误信息:

chown: invalid group: 'nobody:nobody'

相反,您应该使用“nogroup”,如下:

chown nobody:nogroup <dirname>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接