我正在尝试使用PHP来创建文件,但它无法正常工作。我假设这是因为它没有写访问权限(以前一直是问题)。我试图通过使文件夹chmod 0777来测试这是否是问题,但是刚刚结束使该目录中的每个脚本都返回500错误消息,直到我将其更改回来。 如何为我的文件系统提供PHP写入权限,以便创建文件?
编辑:它使用Apache托管在Hostgator共享主机上。
编辑2:有人要求代码: 代码是GD图像脚本。我知道其余部分的工作方式与之前我创建的图像一样。现在我尝试在添加新文本时创建它们并将它们保存到文件夹中。我的写行是: imagejpeg(NULL,$文件,85);
我还创建了一个测试文件来检查它是否只是一个损坏的脚本(主要是从tizag复制): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt(我不知道是否/如何在这里正确发布代码。这是PHP脚本的内容,减去PHP标签。)
它返回13,13,1(单独的行),所以它看起来好像它认为它写了一些东西,但testfile.txt是空白的(我上传了一个空白的),或者不存在(如果我删除它) )。
编辑3:服务器运行CentOS。
答案 0 :(得分:51)
一种简单的方法是让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');
这可以节省您的权限。
答案 1 :(得分:33)
将目录的所有者设置为运行apache的用户。通常没人在linux上
chown nobody:nobody <dirname>
这样你的文件夹就不会是全局可写的了,但仍然可以写入apache:)
答案 2 :(得分:10)
摘要:您需要将目录的所有者设置为PHP使用的用户(Web服务器用户)。
第1步:确定PHP用户
创建包含以下内容的PHP文件:
<?php echo `whoami`; ?>
将其上传到您的网络服务器。输出应类似于以下内容:
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现在应该能够写入目录。
答案 3 :(得分:7)
首先使用以下命令确定哪个用户拥有httpd进程
ps aux | grep httpd
你会得到这样的几行回复:
phpuser 17121 0.0 0.2 414060 7928 ? SN 03:49 0:00 /usr/sbin/httpd
此处第1列显示用户名。所以现在您知道尝试写文件的用户,在这种情况下phpuser
您现在可以继续为php脚本尝试编写内容的目录设置权限:
sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
答案 4 :(得分:3)
您可以使用PHP的chmod()更改文件夹的权限。有关如何使用该命令的更多信息,请访问:http://php.net/manual/en/function.chmod.php
如果在将权限设置为777(全局可写)时出现500错误,则表示您的服务器已设置为阻止执行此类文件。这是出于安全原因。在这种情况下,您将需要使用755作为文件的最高权限。
如果在执行PHP文档的文件夹中生成了error_log文件,则需要查看最后几个条目。这将让您了解脚本失败的位置。
有关PHP文件操作的帮助,我使用http://www.tizag.com/phpT/filewrite.php作为资源。
答案 5 :(得分:2)
我发现使用HostGator你必须将文件设置为CMOD 644和文件夹到755.因为我根据他们的技术支持这样做,它与HostGator一起使用
答案 6 :(得分:2)
您可以将selinux设置为允许分析。
# setenforce 0
Selinux将登录但允许acesses。因此,您可以查看/var/log/audit/audit.log
了解详细信息。也许你需要改变selinux上下文。在此,您将使用chcon
命令。如果您需要,请向我们展示您的audit.log
更详细的答案。
解决问题后别忘了启用selinux。它更好地保持selinux的强制执行。
# setenforce 1
答案 7 :(得分:2)
提供对目录的写访问权限的最佳方式..
$dst = "path/to/directory";
mkdir($dst);
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
答案 8 :(得分:1)
chmod不允许您设置文件的所有权。要设置文件的所有权,必须使用chown命令。
答案 9 :(得分:1)
我遇到了同样的问题:
由于我不愿意将0777提供给我的php目录,我创建了一个权限为0777的tmp目录,在那里我创建了我需要写入的文件。
我的php目录继续受到保护。如果有人攻击tmp目录,该网站将继续像往常一样工作。
答案 10 :(得分:0)
我正在运行Ubuntu,如上所述没有人:没有人不在Ubuntu上工作。你得到错误:
page
相反,你应该使用'nogroup',如:
'data-turbolinks': false
答案 11 :(得分:0)
小小的提示!
回声whoami
;
确保使用反引号
不是
单引号 ' '
!
(当然现在反引号不会出现在这个编辑器中!哦,好吧,我试过了!)