我如何给PHP写一个目录的访问权限?
我正在尝试使用PHP来创build一个文件,但它不工作。 我假设这是因为它没有写权限(以前一直是这个问题)。 我试图通过使文件夹chmod 0777来testing这是否是问题,但是最终导致该目录中的每个脚本都返回500错误消息,直到我将其更改回来。 我如何给我的文件系统写入权限,以便创build一个文件?
编辑:它使用Apache托pipe在Hostgator共享主机上。
编辑2:有人要求的代码:代码是GD图像脚本。 我知道其余的工作,因为以前我每个ime被称为创build图像。 现在我试图在添加新文本时创build它们并将它们保存到文件夹中。 我写的代码行是:imagejpeg(null,$ file,85);
我还创build了一个testing文件,以检查它是否只是一个破碎的脚本(主要是从tizag复制): http ://gearboxshow.info/rkr/lesig.jpg/testfile.txt(我不知道是否/如何发布这里的代码是正确的,下面是PHP脚本的内容,减去PHP标签。)
它返回13,13,1(单独的行),所以它看起来好像它认为它写了东西,但testfile.txt是空白的(我上传一个空白的),或不存在(如果我删除它)。
编辑3:服务器运行CentOS。
一个非常简单的方法是让PHP首先创build目录本身。
<?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) ) { $oldmask = umask(0); // helpful when used in linux server mkdir ($dir, 0744); } file_put_contents ($dir.'/test.txt', 'Hello File');
这为您节省了权限的麻烦。
将目录的所有者设置为运行apache的用户。 通常没有人在Linux上
chown nobody:nobody <dirname>
这样你的文件夹将不会是世界可写的,但仍然可写为阿帕奇:)
首先找出哪个用户拥有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
您可以使用PHP的chmod()更改文件夹的权限。 有关如何使用该命令的更多信息,请访问: http : //php.net/manual/en/function.chmod.php
如果在将权限设置为777(全局可写)时出现500错误,则表示您的服务器已设置为阻止执行此类文件。 这是出于安全原因而完成的。 在这种情况下,您将需要使用755作为文件的最高权限。
如果执行PHP文档的文件夹中生成了error_log文件,则需要查看最后几个条目。 这会给你一个想法脚本失败的想法。
有关PHP文件操作的帮助,我使用http://www.tizag.com/phpT/filewrite.php作为资源。;
我发现,使用HostGator你必须将文件设置为CMOD 644和文件夹为755.由于我是基于他们的技术支持,它与HostGator
chmod不允许你设置文件的所有权。 要设置文件的所有权,您必须使用chown命令。
我有同样的问题:
因为我不愿意给我的PHP目录0777, 我创build了一个权利0777 tmp目录,在那里我创build我需要写入的文件。
我的PHP目录继续受到保护。 如果有人黑客tmp目录,该网站继续照常工作。
您可以将selinux设置为允许以便分析。
# setenforce 0
Selinux将会logging,但允许进入。 所以你可以查看/var/log/audit/audit.log
了解详情。 也许你会需要改变selinux上下文。 这个,你将使用chcon
命令。 如果您需要,请向我们展示您的audit.log
以获得更详细的答案。
解决问题后不要忘记启用selinux。 最好保持selinux的执行。
# setenforce 1
给写入目录的最佳方法..
$dst = "path/to/directory"; mkdir($dst); chown($dst, "ownername"); chgrp($dst, "groupname"); exec ("find ".$dst." -type d -exec chmod 0777 {} +");
我正在运行Ubuntu,正如上面所说的没有人:没有人不在Ubuntu上工作。 你得到错误:
chown: invalid group: 'nobody:nobody'
相反,您应该使用“nogroup”,如:
chown nobody:nogroup <dirname>