如何让 PHP 对目录进行写访问?

我尝试使用 PHP 来创建一个文件,但它不工作。我假设这是因为它没有写访问权限(这以前一直是个问题)。我试图通过创建文件夹 chmod 0777来测试这是否是问题所在,但是这最终导致该目录中的每个脚本返回一个500错误消息,直到我将其修改回来。 我如何给 PHP 写访问我的文件系统,使它可以创建一个文件?

编辑: 它使用 Apache 托管在 Hostgator 共享主机上。

编辑2: 有人问代码: 代码是一个 GD 映像脚本。我知道其余的工作,因为以前我创建的图像,每次它被称为。现在我尝试在添加新文本时创建它们,并将它们保存到一个文件夹中。我的写作方式是: Imagejpeg (null,$file,85) ;

我还创建了一个测试文件来检查它是否只是一个破损的脚本(主要是复制自 Tizag) : Http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (我不知道是否/如何在这里正确地发布代码。下面是 PHP 脚本的内容,减去 PHP 标记。)

它返回13,13,1(单独的行) ,所以它看起来像是写了什么东西,但 testfile.txt 是空的(我上传了一个空的) ,或者不存在(如果我删除它)。

编辑3: 服务器运行 CentOS。

255143 次浏览

一个简单的方法是让 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');

这为您节省了权限方面的麻烦。

您可以使用 PHP 的 chmod ()更改文件夹的权限。有关如何使用该命令的更多信息,请参见: http://php.net/manual/en/function.chmod.php

如果在将权限设置为777(世界可写)时出现500错误,那么这意味着服务器的设置是为了防止执行此类文件。这样做是出于安全原因。在这种情况下,您将希望使用755作为文件的最高权限。

如果在执行 PHP 文档的文件夹中生成了 error _ log 文件,则需要查看最后几个条目。这将让您知道脚本在哪里出错了。

为了获得有关 PHP 文件操作的帮助,我使用 http://www.tizag.com/phpT/filewrite.php作为资源。

将目录的所有者设置为运行 apache 的用户

chown nobody:nobody <dirname>

这样,您的文件夹将不是全世界都可写的,但是对于 apache 仍然可写:)

我发现使用 HostGator 必须将文件设置为 CMOD 644,而将文件夹设置为755。由于我这样做是基于他们的技术支持,它与 HostGator 工程

Chmod 不允许您设置文件的所有权。要设置文件的所有权,必须使用 chown 命令。

我也有同样的问题:

因为我不愿意将0777放到我的 php 目录 我创建了一个权限为0777的 tmp 目录,在那里我创建了需要写入的文件。

我的 php 目录继续受到保护。如果有人入侵 tmp 目录,站点将继续像往常一样工作。

为了进行分析,可以将 selinux 设置为允许。

    # setenforce 0

Selinux 将记录但允许访问。所以你可以查看 /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 {} +");

使用以下命令查明哪个用户拥有 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

我正在运行 Ubuntu,正如上面所说: 没有人不能在 Ubuntu 上工作:

chown: invalid group: 'nobody:nobody'

相反,你应该使用“ nogroup”,比如:

chown nobody:nogroup <dirname>

简单的三步解决方案

摘要: 您需要将目录的所有者设置为 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 现在应该能够写入目录。

一点小提示!

回波 whoami;

确保使用返回报价 没有 单引号’ !

(当然,现在这个编辑器中不会出现反引号了! 哦,好吧,我试过了!)