【问题标题】:How do I give PHP write access to a directory?如何授予 PHP 对目录的写入权限?
【发布时间】:2011-02-23 10:45:27
【问题描述】:

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

【问题讨论】:

  • 这是您控制的服务器还是您在共享服务器上?
  • Hostgator 共享主机。阿帕奇。
  • 服务器运行在什么操作系统上?如果是 Linux,您应该确保 apache 用户(确切的用户名将取决于您的设置 - 在 Linux 下通常是 httpd 或 www-data)具有对该目录的写入权限。您可以将所有者更改为与 apache 相同的用户(使用 chown)并设置为所有者提供写入权限(例如“chmod 755”),或者您可以将其设为全局可写(例如“chmod 777”)。
  • @El Yobo:不要让它成为 777 ......请让我们对 chmod 保持理智。

标签: php file-permissions chmod


【解决方案1】:

小小的提示!

回显whoami;

确保你使用反引号 不是 单引号'' !

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 没错。您可以修改权限以满足您的需要。
    • 这是最简单的解决方案,尽管您不应该在 apache 上使用 777,因为它被配置为阻止这些文件。
    • 我在创建目录时被拒绝!
    • 这假定您对要在其中创建 myDir 的文件夹具有写入权限
    【解决方案3】:

    简单的三步解决方案

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

    【讨论】:

    • 这里完全 OT,但没有其他方法可以 ping 您:感谢您在 Coffee SE 的辛勤标记工作!
    • @Stephie 没问题!
    • 非常好的分步手册,非常感谢!我会补充一点。我解决了将文件写入 vagrant 机器内的 vagrant 共享文件夹的问题,该机器使用您的手册​​运行 apache,但首先,我必须将 chmod -R 0777 设置为本地 PC(包含 vagrant 机器)上的共享文件夹。跨度>
    • 这对我来说非常有效。无需更改即可让我的 PHP 脚本找到可写目录。
    • 这很好用!这应该是公认的答案。
    【解决方案4】:

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

    chown nobody:nobody <dirname>
    

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

    【讨论】:

    • 如果你使用 Ubuntu,这个用户和组不存在。有什么建议可以完成你在这里所做的事情吗?
    • @BrandonMinton 'chown www-data:www-data ' 应该这样做。 www-data 是基于 debian 的系统上的 apache 用户
    • 你好,你说需要chown nobody:nobody &lt;dirname&gt;我必须在哪里编码?
    • @guitarlass 您需要将该命令放入 bash/ssh 窗口
    • 有时我不明白为什么在权限方面工作或不工作,我很高兴这只是工作.....热狗。
    【解决方案5】:

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

    chown: invalid group: 'nobody:nobody'
    

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

    chown nobody:nogroup <dirname>
    

    【讨论】:

      【解决方案6】:

      1st 使用以下命令找出哪个用户拥有 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
      【解决方案7】:

      授予目录写入权限的最佳方式..

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

      【讨论】:

        【解决方案8】:

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

            # setenforce 0
        

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

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

            # setenforce 1
        

        【讨论】:

          【解决方案9】:

          我遇到了同样的问题:

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

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

                您可以使用 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,但我只是做了,它没有包含任何关于它为什么无法生成文件的信息。
                • 发布您遇到问题的代码可能是个好主意。我有时用于文件处理程序语法帮助的一个很好的资源是tizag.com/phpT/filewrite.php
                猜你喜欢
                • 2014-03-30
                • 1970-01-01
                • 2015-04-14
                • 2016-09-09
                • 2014-10-30
                • 2011-07-18
                • 2020-10-19
                • 1970-01-01
                相关资源
                最近更新 更多