File _ put _ content (meta/services.json) : 打开流失败: 权限被拒绝

我是新来的 Laravel。我试图打开 http://localhost/test/public/和我得到了

异常处理程序错误。

我四处搜索,并使用 chmod -R 777 app/storage更改了存储目录的权限,但没有结果。

我改变了 app.php中的 debug=>true,并访问了该页面,得到了异常处理程序中的错误:

流或文件“/var/www/html/test/app/Storage/log/laravel.log” 无法打开: 未能打开流: 在 /var/www/html/test/bootstrap/builed.php: 8423

然后,我使用命令 chmod -R 644 app/storage更改了存储目录的权限,“错误异常处理程序”错误消失了,并且加载了一个页面。但在那里我得到了这个:

File _ put _ content (/var/www/html/laravel/app/Storage/meta/services.json) : 未能打开流: 拒绝许可

402577 次浏览

再次尝试使用 chmod -R 755 /var/www/html/test/app/storage。在 chmod 中使用对于 Operation not permitted的 sudo。如果仍然有错误,请使用检查所有者权限。

Vsmoraes的建议对我很有用:

Laravel > = 5.4

php artisan cache:clear
chmod -R 775 storage/
composer dump-autoload

幼虫数 < 5.4

php artisan cache:clear
chmod -R 775 app/storage
composer dump-autoload

使用 Xampp:

cd /Applications/XAMPP/htdocs
chmod -R 775 test/app/storage

来自 在 Mac OSX 10.8 + 上用 XAMPP 设置 Laravel 4.x

建议正确的权限,如果对于 Apache,

sudo chown -R apache:apache apppath/app/storage

有时候是 SELINUX 造成了这个问题; 您可以使用这个命令禁用 selinux。

sudo setenforce 0

对于那些面临 Laravel5这个问题的人来说,这是一个权限问题,因为不同的用户试图用不同的权限写入 storage/logs文件夹中的同一个日志文件。

你的 Laravel 配置可能是为了每天记录错误而设置的,因此你的 web 服务器(Apache/nginx)可能在默认用户下创建这个文件,这取决于你的环境,它可以是 OSX 上的 _www或 * NIX 系统上的 www-data,然后问题来了,当你可能运行了一些工匠命令,得到了一些错误,所以工匠会写这个文件,但对于不同的用户,因为 PHP 在终端是由不同的用户实际上你的登录用户,你可以通过运行这个命令来检查它:

php -i | grep USER

如果您的登录用户创建的日志文件,您的网络服务器将无法写入错误,反之亦然,因为 Laravel 写日志文件默认使用 655权限,这只允许所有者写在它。

要解决这个临时问题,您必须手动将 664组的权限授予该文件,以便您的登录用户和 Web 服务器用户都可以写入该日志文件。

为了永久避免这个问题,当在 storage/logs目录中创建新文件时,您可能需要设置一个适当的权限,方法是继承来自这个答案 https://unix.stackexchange.com/a/115632可以帮助您处理的目录的权限。

如果您有 Laravel 5号并且正在寻找永久的解决方案,那么可以使用 php artisan命令行和 Apache 服务器使用以下方法:

sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart

见详细说明 给你

每当我修改 app.php 时,我都会得到一个拒绝写 bootstrap/cache/services.json 的权限,所以我这样做是为了修复它:

chmod -R 777 bootstrap/cache/

对于所有使用 Laravel 5、 Homestead 和 Mac 的用户,请尝试以下方法:

mkdir storage/framework/views
rm storage/logs/laravel.log

帮我解决了这个问题

对于流浪用户,解决方案是:

(在流浪者) php 工匠缓存: 清除

(在流浪者之外) chmod-R 777应用程序/存储

(流浪汉)作曲家自动加载

确保你的 chmod 在当地的环境,而不是在流浪者在这里是重要的!

问题解决了

php artisan cache:clear
sudo chmod -R 777 vendor storage

这使得写权限应用程序,框架,日志希望这将有所帮助

您不应该给777权限。这是一个安全风险。 对于 Ubuntu 用户,在 Laravel 5中,我建议递归地更换目录存储的所有者:

试试以下方法:

sudo chown -R www-data:www-data storage

在基于 Ubuntu 的系统中,www-data 是 apache 用户。

对于任何使用 SELINUX 运行操作系统的人: 允许 httpd 写入 laravel 存储文件夹的正确方法是:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'

然后立即应用这些变化:

sudo restorecon -F -r '/path/to/www/storage'

SELinux 可能是一个痛苦的处理,但如果它的存在,那么我强烈建议你学习它,而不是完全绕过它。

如果其他人遇到类似的问题与 fopen 文件权限错误,但足够明智,不要盲目 chmod 777这里是我的建议。

检查您正在使用的命令以获得 Apache 所需的权限:

fopen('filepath/filename.pdf', 'r');

‘ r’表示打开只读,如果没有编辑文件,应该将其设置为这样。这意味着 apache/www-data 至少需要该文件的读权限,如果该文件是通过 laravel 创建的,那么它将已经具有读权限。

如果出于某种原因,您必须写入该文件:

fopen('filepath/filename.pdf', 'r+');

然后确保 apache 也有写入文件的权限。

Http://php.net/manual/en/function.fopen.php

根据 Laravel 5.4,也就是我写这篇文章的最新版本,如果你有类似的问题,你需要更改许可。 不要听任何人告诉你为任何目录设置777。 有个安全问题。 更改存储文件夹的权限,如下所示

sudo chmod -R 775 storage

像这样更改引导文件夹权限

sudo chmod -R 775 bootstrap/cache

现在,请确保正在从应用程序目录执行这两个命令。你将来不会在许可方面遇到问题。775不会影响你机器的安全。

我也有同样的问题,下面的步骤帮助我解决了这个问题。

  1. 在公用文件夹中找到 apache 用户用代码创建的 test.php 文件

<?php echo exec('whoami'); ?>

然后在浏览器上运行文件。它会给阿帕奇用户。在我的例子中,它是 ec2-user,因为我在/etc/cron.d/中安装 cronjob 时使用了 aws。对其他人来说,它可能是不同的用户。

  1. 在命令行上运行以下命令。

sudo chown -R ec2-user:<usergroup> /app-path/public

您需要在这里标识并使用正确的“用户”和“用户组”。

我已经尝试给予 777访问存储文件夹,它为我工作

1)进入你的 laravel 根目录(对我来说是 /var/www/html)并运行以下命令

chmod 777 -R storage

在我的案例中,解决方案是更改对 app/storage/framework/viewsapp/storage/logs目录的权限。

使用 artisian启动服务器

php artisian serve

然后从指定的 URL 访问您的项目:

enter image description here

如果使用 laradock,请在工作区容器中尝试 chown -R laradock:www-data ./storage

我在 Mac 上管理流浪汉的时候也遇到过同样的问题。通过在 https.conf 文件中更改 Apache 服务器的用户,解决了这个问题:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $

在 php 用户下运行 apache 而不是用户守护进程来解决 php 的文件访问问题

# change default apache user from daemon to php user
sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf

现在,php 创建的缓存文件可以由 apache 读取和编辑,而不会显示任何访问权限错误。

在对目录权限进行了大量的尝试和错误之后,我突然明白了... ... 磁盘分区上已经没有空间了。我只是想和大家分享一下,确保没有其他人会蠢到继续朝着错误的方向寻找解决方案。

在 Linux 中,您可以使用 df -h来检查磁盘大小和可用空间。

设置权限到777绝对是一个糟糕的主意!

但是

如果您得到的权限错误与“存储”文件夹连接,这是我的工作:

1)设置“存储”及其子文件夹权限为777

sudo chmod -R 777 storage/

2)在浏览器中进入 laravel 主页 laravel/public/(laravel 将创建必要的初始存储文件)

3)返回安全的775存储权限及其子文件夹

sudo chmod -R 775 storage/

永远不要给它的许可777!

到终端机上的 Laravel 项目目录下写:

sudo chown -R your-user:www-data /path/to/your/laravel/project/
sudo find /same/path/ -type f -exec chmod 664 {} \;
sudo find /same/path/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

通过这种方式,您可以让您的用户成为所有者,并给予特权:
执行,写,读
1 + 2 + 4 = 7意味着(rwx)
2 + 4 = 6表示(rw)
最后,对于存储访问,ug + rwx 意味着给用户和组一个7

这个问题实际上是由不同的用户想要 write/read文件而拒绝引起不同的所有权造成的。也许你作为‘ root’安装了 laravel,然后你作为‘ laravel’用户登录到你的网站,‘ laravel’是默认的所有权,所以这才是真正的问题。因此,当用户‘ laravel’想要默认读/写磁盘中的所有文件时,将被拒绝,因为该文件由‘ root’拥有所有权。

要解决这个问题,你可以这样做:

sudo chown -hR your-user-name /root /nameforlder

或者像我这样

sudo chown -hR igmcoid /root /sublaravel

脚注:

  1. root为名第一个所有权的人安装之前
  2. your-user-name作为默认所有权,谁实际上在站点中写/读。
  3. namefolder作为名称文件夹,希望您更改所有权。

我的项目也出现了同样的错误。
但是我发现我忘了把 enctype放在我的表格里。

<form method="#" action="#" enctype="multipart/form-data">

希望能有所帮助。

在使用 Laragon 和 Laravel 4操作 Windows 10时,似乎没有办法手动更改权限,因为在 Laragon 内置终端中执行 chmod命令没有任何效果。

但是,在这个终端中可以转到存储文件夹并手动添加所需的文件夹,如下所示:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

终端中的 cd-命令将您带到文件夹(您可能需要调整此路径以适应您的文件结构)。 mkdir-命令将创建具有给定名称的目录。

我没有机会在 Laravel 5中测试这种方法,但是我希望类似的方法应该可以工作。

当然可能有更好的方法,但至少这是一个合理的解决方案(修复错误: file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream)。

如果您使用 Linux 或 Mac,甚至您也可以在 ssh terminal中运行。可以使用终端运行此命令,

 php artisan cache:clear
sudo chmod -R 777 storage
composer dump-autoload

如果使用窗口,则可以使用 git bash运行。

 php artisan cache:clear
chmod -R 777 storage
composer dump-autoload

您可以从 https://git-scm.com/downloads下载 git。

  1. 首先,删除存储文件夹,然后再次创建存储文件夹。
  2. 在存储文件夹内部创建一个新的文件夹名作为框架。
  3. 在框架文件夹中创建三个文件夹名称作为缓存、会话和视图。

我这样做已经解决了我的问题。

上面的解决方案对我来说都没有用,因为 我没有 SSH 的访问权限运行命令来清除缓存或给予递归权限,所以我通过删除这个文件修复了这个问题。

您可以删除 bootstrap/cache/config.php文件。

我遇到了同样的问题,但是在 view目录中:

file_put_contents(/var/www/app/storage/framework/views/237ecf97ac8c3cea6973b0b09f1ad97256b9079c.php): failed to open stream: Permission denied

我用下面的 artisan命令解决了清理 view缓存目录的问题:

php artisan view:clear

尝试这样做。将 user:group更改为 http 服务器的用户: 组所有者:

cd storage && sudo chmod 2775 . && sudo chown -R user:group . && sudo chmod -R og-r . && sudo find . -type d -exec chmod g=rwxs '{}' \; && sudo find . -type f -exec chmod g=rw '{}' \; && sudo setfacl -d -m g::rwx . && sudo setfacl -d -m o::rx .

这将使所有新文件和文件夹都采用这些设置。