file_put_contents权限被拒绝


97

我正在尝试将查询写入文件以进行调试。该文件位于中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文件中是否有任何拒绝文件访问的内容?
Hello71 2011年

2
还请确保目录正确正确
Crayon Violent

1
也尝试使用绝对文件名。可能只是您对当前文件夹的解释与PHP的解释有所不同
laher 2011年

1
您可以再次检查chmod的状态吗?
约拿(Jonah)

1
没有为这种问题排查清单:stackoverflow.com/questions/36577020/...
维克Seedoubleyew

Answers:


72

尝试调整目录权限。

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

apache,如果正确修改该目录,则没有人可以访问该目录。

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


104
777不存在安全风险吗?
hitautodestruct

12
我强烈怀疑不仅目标目录必须可由服务器帐户写入,而且目标目录的每个父目录都必须允许服务器帐户导航到该目录;我认为这将是权限的+ x。
Erhannis

2
我在新的LAMP堆栈上试验了Erhannis的理论,该理论是正确的。
thotheol13年

4
我认为@MajidFouladpour chmod +x /parent/directory对于目标的每个父目录。 chmod +x /parent/directorychmod +x /parent等等
Erhannis

1
现在有这样的问题排查清单:stackoverflow.com/questions/36577020/...
维克Seedoubleyew

18

另一种选择

是您可以制作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文件的根文件夹


3

伙计们,我在这个问题上呆了1个月,做了一切,但无法解决,但是现在我知道了解决方案。

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

在您的主机中创建一个文件,例如mytest.php,并将此代码放入并保存:

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

一次打开URL“ www.your-domain.com/mytest.php”,然后检查您的电子邮件。您应该收到来自主机的电子邮件,其中包含您在mytest.php中输入的信息,并检查发件人姓名。如果来自Nobody,则由于未定义内容而对“权限被拒绝”存在问题,并且发件人名称类似于我的ID:iietj8qy@hostname5.netly.net,则没有问题。

我的管理员更改了服务器并重新安装了主机,我认为问题已经解决,请告诉您的主机管理我告诉了您什么,也许他们找到了答案。

希望对您有帮助!


我完全迷路了!你想说什么 如果您说的是apache用户无法获取服务器(共享或其他名称)上的主机名,那么是时候重新考虑选择托管服务了。
Fr0zenFyr '16

3

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

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

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

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

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

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

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

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

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

需要能够读写文档,但执行文件不是必需的。将7分配给文件的所有者,将6分配给组。Web服务器不需要具有执行文件的权限即可更改其内容。这些写许可权应仅授予该目录中的文件。

所有其他用户均不应获得任何许可。

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

https://wiki.debian.org/权限

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

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


3

从此链接stackoverflow-image save收集信息不适用于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转到包含“ images”文件夹的文件夹。然后输入:

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

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

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


1

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

我只是通过打开nautilus(sudo nautilus)并在要尝试打开的文件上单击鼠标右键,单击“属性”>“设置”>,然后对“其他所有人”进行读写操作来解决此问题。


0

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

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


0

可以通过以下步骤解决此问题:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

希望能帮助到你


0

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

php artisan cache:clear

有时候,如果您的应用程序在git pull之前就可以运行,那可能只是个窍门



-2

有2种解决此问题的方法
1.使用chmod 777 path-to-your-directory
如果不起作用,则
2.仅提供文件的完整路径query.txt


2
这是非常不安全的做法,而且是非常糟糕的做法。开发自定义应用程序时也很难检测和纠正,并且很容易被忽略。请实际找出正确的权限。
frottter

-3

这里解决。从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)

-11

此外,正如说在file_put_contents man pagephp.net,谨防命名问题。

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

可能不起作用(即使语法正确),但

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

作品。我在不同的php安装服务器上经历了这一点。


17
这是不正确的。$dir."/file.txt"在功能上等效"$dir/file.txt"于所有情况(假设$dir是字符串)。此外,正如Kivanc所说,此行为未在php.net上记录。
mattbasta 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.