77

我正在尝试使用 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。

4

12 回答 12

63

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

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

于 2010-05-24T22:20:50.620 回答
36

将目录的所有者设置为运行 apache 的用户。linux上经常没人

chown nobody:nobody <dirname>

这样你的文件夹就不会是世界可写的,但对于 apache 仍然是可写的 :)

于 2010-05-25T02:01:37.280 回答
32

简单的三步解决方案

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

于 2018-03-30T00:18:01.383 回答
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
于 2016-01-27T08:45:33.917 回答
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作为资源。

于 2010-05-24T22:25:52.147 回答
3

我发现使用 HostGator,您必须将文件设置为 CMOD 644,将文件夹设置为 755。因为我是根据他们的技术支持这样做的,所以它适用于 HostGator

于 2011-07-31T19:34:11.440 回答
3

我有同样的问题:

由于我不愿意将 0777 提供给我的 php 目录,因此我创建了一个权限为 0777 的 tmp 目录,我在其中创建了我需要写入的文件。

我的 php 目录继续受到保护。如果有人入侵了 tmp 目录,该站点将继续照常工作。

于 2014-12-22T21:00:44.177 回答
3

您可以将 selinux 设置为 permissive 以便分析。

    # setenforce 0

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

解决问题后不要忘记启用 selinux。最好保持 selinux 的强制执行。

    # setenforce 1
于 2015-09-23T14:54:08.823 回答
3

授予对目录的写访问权限的最佳方法..

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
于 2016-01-07T08:22:36.297 回答
2

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

于 2013-03-23T15:44:47.373 回答
2

我正在运行 Ubuntu,如上所述,nobody:nobody 不能在 Ubuntu 上运行。你得到错误:

chown: invalid group: 'nobody:nobody'

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

chown nobody:nogroup <dirname>
于 2017-10-03T21:42:30.927 回答
-1

小小的提示!

回声whoami

确保你使用 BACK QUOTES 而 不是单引号 ' ' !

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

于 2021-03-17T21:07:46.910 回答