【问题标题】:file_put_contents - failed to open stream: Permission deniedfile_put_contents - 无法打开流:权限被拒绝
【发布时间】:2011-06-22 12:20:44
【问题描述】:

我正在尝试将查询写入文件以进行调试。该文件位于database/execute.php。我要写入的文件是database/queries.php

我正在尝试使用file_put_contents('queries.txt', $query)

但我得到了

file_put_contents(queries.txt) [function.file-put-contents]: 无法打开流:权限 拒绝

我有 queries.txt 文件 chmod'd 到 777,可能是什么问题?

【问题讨论】:

  • 您查看过php.ini 文件是否有任何可能拒绝文件访问的内容?
  • 还要确保目录是正确的 chmod
  • 也尝试使用绝对文件名。可能只是您对当前文件夹的解释与 PHP 的不同
  • 你能仔细检查一下 chmod 状态吗?
  • 此类问题有一个故障排除清单:stackoverflow.com/questions/36577020/…

标签: php file-io file-permissions


【解决方案1】:

尝试调整目录权限。

从终端运行chmod 777 database(从包含数据库文件夹的目录)

如果 chmodd 正确,apache 并且没有人可以访问此目录。

要做的另一件事是回显“getcwd()”。这将向您显示当前目录,如果这不是“/something.../database/”,那么您需要将“query.txt”更改为服务器的完整路径。

【讨论】:

  • 777不是安全隐患吗?
  • 我强烈怀疑不仅目标目录必须可由服务器帐户写入,而且目标目录的每个父目录都必须允许服务器帐户导航到其中;我认为这将是权限的 +x。
  • 我在一个新的 LAMP 堆栈上试验了 Erhannis 的理论,这个理论是正确的。
  • @MajidFouladpour 我认为chmod +x /parent/directory,对于目标的每个父目录。 chmod +x /parent/directorychmod +x /parent
  • 现在有一个针对此类问题的故障排除清单:stackoverflow.com/questions/36577020/…
【解决方案2】:

您可以将Apache (www-data)设为文件夹的所有者:

sudo chown -R www-data:www-data /var/www

这应该使file_put_contents 现在可以工作了。但为了更安全,您最好还设置如下权限:

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • /var/www更改为您的php文件的根文件夹

【讨论】:

  • 你的 find 命令不起作用,我得到Argument list too long
  • @Black 猜你需要将/var/www 更改为你应用的目录
【解决方案3】:

无需手动将查询写入这样的文件。 MySQL 内置了日志记录支持,您只需在开发环境中启用它即可。

看看the documentation for the 'general query log'

【讨论】:

    【解决方案4】:

    从此链接 stackoverflow-image save doesn't work with chmod 777 以及用户 azerafati 和 Loek Bergman 收集信息

    如果您要查看 /etc/apache/envvars 文件,您会看到如下内容:

    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data
    

    Apache 在用户名“www-data”下运行

    '0755' 表示文件所有者可以读/写/执行,但组和其他用户不能写。所以在你的终端中,cd 到包含你的“图像”文件夹的文件夹。然后输入:

    find images -type d -exec chmod 0755 {} \;
    find images -type f -exec chmod 0755 {} \;
    sudo chown -R www-data:www-data images
    

    您必须先更改权限,然后才能更改所有者。 出现提示时输入您的密码。这将使“www-data”成为图像文件夹的所有者。

    您的上传现在应该可以工作了。

    【讨论】:

      【解决方案5】:

      我知道这是一个非常古老的问题,但我想通过一些深入的解释来添加好的解决方案。您将不得不在类似 Ubuntu 的系统上执行两条语句,然后它就会像魅力一样工作。

      Linux 中的权限可以用三位数字表示。第一个数字定义文件所有者的权限。第二个数字是特定用户组的权限。第三个数字定义了所有非所有者或组成员的用户的权限。

      网络服务器应该使用组成员的 id 执行。网络服务器不应该以与文件和目录所有者相同的 ID 运行。在 Ubuntu 中,在 id www-data 下运行 apache。该 id 应该是为其指定权限的组的成员。

      要为您要更改文件内容的目录赋予适当的权限,请执行以下语句:

      find %DIR% -type d -exec chmod 770 {} \;
      

      。这意味着在 OP 问题中应该相应地更改目录 %ROOT%/database 的权限。因此,重要的是不要在该目录中包含不应更改或删除的文件。因此,最好为必须更改内容的文件创建一个单独的目录。

      目录的读取权限 (4) 意味着能够收集目录中的所有文件和目录及其元数据。写权限 (2) 授予更改目录内容的权限。暗示添加和删除文件,更改权限等。执行权限(1)意味着您有权进入该目录。如果没有后者,就不可能深入到目录中。当需要更改文件内容时,网络服务器需要读取、写入和执行权限。因此需要组数字7。

      第二个陈述是关于OP的问题:

      find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;
      

      需要能够读取和写入文档,但不需要执行文件。 7 分配给文件的所有者,6 分配给组。网络服务器不需要具有执行文件的权限即可更改其内容。这些写权限应该只授予该目录中的文件。

      不应向所有其他用户授予任何权限。

      对于不需要更改其文件的目录,组权限为 5 就足够了。 有关权限的文档和一些示例:

      https://wiki.debian.org/Permissions

      https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

      http://www.linux.org/threads/file-permissions-chmod.4094/

      【讨论】:

        【解决方案6】:

        我使用共享 Linux 主机,当我的管理员将 php 更改为 5.3 时,“file_put_contents”代码出现许多错误。尝试测试我的计划:

        在你的主机中创建一个类似 mytest.php 的文件,并将这段代码放入并保存:

        <?php        mail('Your-EMail','Email-Title','Email-Message');        ?>
        

        打开网址“www.your-domain.com/mytest.php”一次,然后查看您的电子邮件。您应该收到一封来自您的主机的电子邮件,其中包含您在 mytest.php 中输入的信息,检查发件人姓名。如果它来自Nobody,你有关于“权限被拒绝”的问题,因为没有定义一些东西,如果发件人姓名像我的 id:iietj8qy@hostname5.netly.net,你没有问题。

        我认为我的管理员更改了服务器并再次安装了主机,问题得到了解决,告诉你的主机管理员我告诉你的内容,也许他们会找到答案。

        【讨论】:

        • 我完全迷路了!!你想说什么?如果您说 apache 用户无法获取服务器上的主机名(共享或其他),那么您应该重新考虑选择托管服务了。
        【解决方案7】:

        如果您从本地 git 拉取到服务器,有时您需要清除缓存,因为它与它一起上传的视图文件/或其他缓存文件。

        php artisan cache:clear
        

        如果您的应用程序在 git pull 之前运行,有时它可能只是为了解决问题

        【讨论】:

        • 是的,view:clear 对我有用。不知道为什么会经常出现这样的错误!
        【解决方案8】:

        对于使用 Ubuntu 并在本地加载页面时收到此错误的任何人,而不是在 Web 托管服务上,

        我刚刚通过打开 nautilus (sudo nautilus) 并右键单击您要打开的文件,单击属性 > 设置 > 并为“其他所有人”提供读写权限来解决此问题

        【讨论】:

          【解决方案9】:

          这可以通过以下步骤解决:

          1. $ php artisan cache:clear
          
          2. $ sudo chmod -R 777 storage
          
          3. $ composer dump-autoload
          

          希望对你有帮助

          【讨论】:

            【解决方案10】:

            这可能会有所帮助。它对我有用。在终端尝试一下

            setenforce 0

            【讨论】:

              【解决方案11】:

              有同样的问题;我的问题是 selinux 设置为强制执行。

              即使在 chmod 到 777 并确保所有父文件夹都具有 apache 用户的执行权限后,我仍然收到“无法打开流:权限被拒绝”错误。原来我的问题是 selinux 被设置为强制执行(我在 centos7 上),这是一个 devbox,所以我把它关掉了。

              【讨论】:

                【解决方案12】:

                使用此命令授予存储/框架和日志的权限

                 sudo chmod -R 777 storage/logs storage/framework
                

                如果您仍然有权限错误 试试这个给组写日志

                sudo chmod g+w storage/logs
                

                【讨论】:

                  【解决方案13】:

                  我遇到了同样的问题,我正在使用 Laravel,所以我刚刚做的是:

                  php artisan view:clear
                  

                  并且修复了!

                  【讨论】:

                    【解决方案14】:

                    我停止了病毒扫描程序 (Avast)。这解决了问题!最终,Avast 似乎有一个勒索软件防护罩阻止了对 documentroot 文件夹的写入操作。为单个程序(PHP、Tesseract)添加屏蔽异常解决了这个问题!

                    【讨论】:

                      【解决方案15】:

                      解决方案在这里。 从 URL 复制 img。 这个网址:http://url/img.jpg

                      $image_Url=file_get_contents('http://url/img.jpg');
                      

                      创建所需路径以.jpg完成名称

                      $file_destino_path="imagenes/my_image.jpg";
                      
                      file_put_contents($file_destino_path, $image_Url)
                      

                      【讨论】:

                        【解决方案16】:

                        有两种方法可以解决此问题
                        1。使用chmod 777 path-to-your-directory
                        如果它不起作用,那么
                        2。只需提供文件的完整路径query.txt

                        【讨论】:

                        • 这是非常不安全且极其糟糕的做法。在开发自定义应用程序时也很难检测和纠正,并且很容易被忽视。请实际找出正确的权限。
                        【解决方案17】:

                        此外,正如file_put_contents man page in php.net 中所说,请注意命名问题。

                        file_put_contents($dir."/file.txt", "hello");
                        

                        可能不起作用(即使它在语法上是正确的),但是

                        file_put_contents("$dir/file.txt", "hello");
                        

                        有效。我在不同的 php 安装服务器上遇到过这种情况。

                        【讨论】:

                        • 这是不正确的。 $dir."/file.txt" 在所有情况下都在功能上等同于 "$dir/file.txt",假设 $dir 是一个字符串。此外,正如 Kivanc 声称的那样,这种行为没有记录在 php.net 上。
                        猜你喜欢
                        • 2014-11-29
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-06-25
                        • 2018-04-25
                        • 2022-09-22
                        • 2016-09-21
                        • 1970-01-01
                        相关资源
                        最近更新 更多