file_put_contents(meta / services.json):无法打开流:权限被拒绝


168

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

异常处理程序中的错误。

我四处搜寻,并更改了存储目录的权限,chmod -R 777 app/storage但无济于事。

debug=>true进入app.php并访问了该页面,并在异常处理程序中收到错误消息:

无法打开流或文件“ /var/www/html/test/app/storage/logs/laravel.log”:无法打开流:/ var / www / html / test / bootstrap / compiled中的权限被拒绝。 php:8423

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

file_put_contents(/var/www/html/laravel/app/storage/meta/services.json):无法打开流:权限被拒绝


2
貌似permition问题再次,文件模式递归所有的应用程序目录
阿劳

@alou我想我已经用chmod -R 777 app / storage完成了。不是吗 而且应用内的所有目录都具有drwxrwxrwx权限。
vishnub1626

33
试试:php artisan cache:clear然后chmod -R 777 app/storage终于php artisan dump-autoload
vsmoraes 2014年

@vsmoraes有效。如果您可以解释问题出在什么地方,这将非常有帮助。
vishnub1626

7
vsmoraes的评论是正确的,但是应该改为“ composer dump-autoload”,而不是“ php artisan dump-autoload”
Elliot Robert

Answers:


320

vsmoraes的建议对我有用

Laravel> = 5.4

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

Laravel <5.4

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

注意:请勿在任何远程服务器(开发或生产)上执行此操作

当我问这个问题时,这是在虚拟机上运行的本地主机上的一个问题。因此,我认为安装777足够安全,但是,当人们说您应该寻找其他解决方案时,他们是正确的。首先尝试775


8
这应该是sudo chmod -R 777应用程序/存储。以避免权限错误。
Olaitan Mayowa 2014年

5
#Laravel5的指令几乎相同:php artisan cache:clear,然后 chmod -R 777 storage,然后 composer dump-autoload
WNRosenberg

6
如果您使用的是Laravel 5.1+,则需要chmod -R 777 storage改用
James

10
php artisan cache:clear是正确的答案。然后sudo chmod -R ug+rw storage为我提供正确的权限,而不提供others读/写或特别是执行特权。
Zack Morris

43
这个答案和线索凸显了为什么我如此不喜欢Laravel:它教会开发人员您可以随时随地执行所需的任何操作,而不必考虑后果(我了解777Laravel并非特定于此,但是Laravel开发人员的思维过程是:“立即开始工作,我不在乎如何工作”,就像777)。作为一般规则,永远不要设置任何东西777以使某些东西起作用。了解您的服务器和用户/角色并进行相应设置;不要乱动它。您的客户信任您这样做。
dKen

70

对于使用Laravel 5遇到此问题的Google员工。

这是一个权限问题,由不同的用户尝试以storage/logs不同的权限在文件夹内的同一日志文件中写入而引起。

发生的情况是您的laravel配置可能设置为每天记录错误,因此您的网络服务器(apache / nginx)可能会根据您的环境在默认用户下创建此文件,这可能类似于_wwwOSX或www-data* NIX系统上的问题,然后出现此问题当您可能已经运行了一些artisan命令并出现一些错误时,就会出现此情况,因此artisan将使用其他用户来编写此文件,因为终端上的PHP实际上是由其他用户(您的登录用户)执行的,因此您可以通过运行此命令将其签出:

php -i | grep USER

如果您的登录用户在您的Web服务器上创建了该日志文件,则您将无法在其中写入错误,反之亦然,因为laravel用 655默认情况下权限的权限仅允许所有者在其中写入。

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

为永久避免此问题,您可能希望在storage/logs目录中创建新文件时通过从目录中继承权限来设置适当的权限,此答案https://unix.stackexchange.com/a/115632可以帮助您解决那。


fan-friggen-tastic回答在这里!我在Elastic Beanstalk上运行,我的命令行PHP用户为“ ec2-user”,但我的应用程序以“ webapp”运行。
兰迪L

1
可以解释问题的答案。即一个正确的答案。
Craicerjack

这帮助我意识到了为什么在Cloudways上的Laravel中出现文件缓存错误。我需要按Cloudways面板中的按钮来重置文件权限。谢谢。
Ryan

44

您不应该授予777权限。这是安全隐患。对于Ubuntu用户,在Laravel 5中,我建议递归地更改目录存储的所有者:

请尝试以下操作:

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

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


2
这个问题对我来说是固定的,并且比chmod 777答案更正确(我认为)。谢谢
〜– GavinR

我认为这是Linux用户最方便的答案。谢谢@GavinR。chmod 777是一场噩梦。
Abdalla Arbab '18

这对我有用,并且绝对是比chmod -777
Egnaro '04

感谢您提供解决问题的新方法!为了扭转chmod 777后果,我们需要在您的命令之前/之后做点什么?
Aleksandar '18

41

对于使用Laravel 5,Homestead和Mac的所有人,请尝试以下操作:

mkdir storage/framework/views

这也可以与使用Laravel 5.2.7的Laravel Forge制作新服务器配合使用
winkster,2016年

2
这为我做到了。似乎bootstrap/cache/compiled.php正在尝试写入此目录,但该目录不存在,最终抛出权限错误。谢谢。
Matt K

1
某种程度上,这对我有用。我正在使用laravel 5.1 btw
Yohanes Gultom '16

这样做对我来说很好,谢谢。我已经删除了整个存储目录,以为这将由laravel再次生成,请猜不是。
grimmdude

33

有时SELINUX导致了此问题;您可以使用此命令禁用selinux。

sudo setenforce 0

哇,我确实成功了,而且能奏效,有人可以向我解释为什么会奏效吗?什么是selinux?
undefinedman

是的,这确实有效!请帮助我们的专家在SELINUX上了解这一点吗?即时通讯使用fedora 24 btw
loki9

1
谢谢,非常感谢。我在网上搜索,每个人都对我说检查权限,检查用户等等……
Ali ZahediGol

3
基本上就像关闭整个防火墙一样,因为它阻止了您需要打开的端口。
Tee JoE

我从未听说过。“增强安全性的Linux(SELinux)是Linux内核安全性模块,它提供了一种支持访问控制安全性策略的机制。” 我怀疑将其关闭是个好主意。我敢打赌,支持者会在不了解全部后果的情况下盲目使用此命令。
瑞安(Ryan)

18

问题解决了

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

这将启用对app,框架,日志的写入权限希望这会有所帮助


12
永远不要777 ...在dev或prod中,因为它会给人幻想在dev中工作的东西,但是除非在777方面这不是一个好主意,否则它们将在prod中闯入
Kyle Burkett

wooha,你摇滚...供应商是我所缺少的
lu1s

是的,在面向公众的网络777上提供任何内容都不是个好主意
imabug '18年

17

绝对不要给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读取
1 + 2 + 4 = 7表示(rwx)
2 + 4 = 6
最终表示(rw),用于存储访问ug + rwx表示您要给用户和组一个7


1
我不知道为什么很多开发都喜欢用777 ......不知何故他们没有关心自己的系统..
ZeroOne

15

对于无业游民的用户,解决方案是:

(无业游民)php artisan cache:clear

(无业游民之外)chmod -R 777应用/存储

(无家可归)作曲家转储自动加载

确保您在本地环境中使用chmod而不是在流浪汉中很重要!


6
777不太开放吗?
simo

3
我的意思是,对于生产来说,是肯定的。但这是一个本地开发环境。原始海报使用的是777,而其他答案。775或755可能适用。
布伦丹

12

再试一次chmod -R 755 /var/www/html/test/app/storageOperation not permitted在chmod中与sudo一起使用。如果仍有错误,请使用“检查所有者”权限。


不工作 应用内的所有目录均具有drwxrwxrwx权限
vishnub1626

@tav您可以检查测试文件夹的所有者权限吗?
凯2014年

相同的drwxrwxrwx。使用@vsmoraes的建议解决了问题(请参阅评论)
vishnub1626

4
chmod 777存在安全风险
Yogesh Kamat

9

根据我撰写本文时最新的Laravel 5.4,如果您有这样的问题,则需要更改权限。 请勿听任何告诉您将777设置为任何目录的人的信息。 它有一个安全问题。这样更改存储文件夹的权限

sudo chmod -R 775 storage

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

sudo chmod -R 775 bootstrap/cache

现在,请确保您正在从应用程序目录中执行这两个命令。您将来不会在许可方面遇到任何问题。775不会损害您计算机的任何安全性。


7

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

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

Laravel Forge使用:sudo chown -R forge:forge〜/ project / storage / sudo chown -R forge:forge〜/ project / bootstrap / cache /
Flappy

6

如果您有Laravel 5并希望使用永久解决方案,则适用于php artisan命令行用法和Apache服务器都可以使用此命令:

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

请参阅此处的详细说明。


8
使用777
Randy L

在resolv.conf中的umask 000?!这些人从哪里获得此信息?那是resolv.conf中的无效行。请忽略此以及那里的所有777个“解决方案”
higuita

检查网址,在resolv.conf linux.die.net/man/5/resolv.conf中
higuita

6

对于使用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可能很难处理,但是如果有的话,我强烈建议您学习它,而不是完全绕开它。


我在新鲜centos 7中的确切问题是相似的。有人说没有写许可,但全部都是777进行测试。因此,经过所有常规检查后,这篇文章实际上节省了我的时间。
2016年

1
这是正确的解决方案,尽管我认为正确的SELinux类型应该为httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

我遇到了同样的问题,以下步骤可帮助我解决问题。

  1. 找出apache用户-使用代码在公共文件夹中创建一个test.php文件

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

并从Web浏览器运行文件。它会给apache用户。就我而言,它是ec2用户,因为我使用的是/etc/cron.d/中安装了cronjob的aws。其他人可能是不同的用户。

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

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

您需要在此处标识和使用正确的“用户”和“用户组”。


4

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

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

如果您使用的是Windows,则可以使用来运行git bash

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

您可以从以下网址下载git形式:https://git-scm.com/downloads



2

每当我更改app.php时,都会获得拒绝写入bootstrap / cache / services.json的权限,所以我这样做来解决此问题:

chmod -R 777 bootstrap/cache/

8
chmod 777存在安全风险
Yogesh Kamat


2

将许可设置为777绝对是一个糟糕的主意!

...但是

如果您遇到与“存储”文件夹有关的权限错误,那么这对我有用:

1)使用以下命令将“ storage”及其子文件夹权限设置为777

sudo chmod -R 777 storage/

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

3)将775保险柜归还存储及其子文件夹

sudo chmod -R 775 storage/

2

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


1

就我而言,解决方案是更改对app/storage/framework/viewsapp/storage/logs目录的权限。


0

如果其他任何人遇到了fopen文件权限错误的类似问题,但明智的选择是不要盲目chmod 777,这是我的建议。

检查您使用的命令以获取apache所需的权限:

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

“ r”表示只读,如果您不编辑文件,则应将其设置为“ r”。这意味着apache / www-data至少需要对该文件具有读取权限,如果通过laravel创建该文件,则该文件已经具有读取权限。

如果出于任何原因必须写入文件:

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

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

http://php.net/manual/zh/function.fopen.php


0

只需使用以下命令启动服务器 artisian

php artisian serve

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

在此处输入图片说明


0

在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

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


0

经过大量的目录权限反复试验后,我突然顿悟了……磁盘分区上没有剩余空间了。只是想分享一下,以确保没有其他人愚蠢到继续向错误的方向寻找解决方案。

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


0

此问题实际上是由想要 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 作为要更改所有权的名称文件夹。

0

我在项目中遇到了同样的错误...
但是发现我忘记enctype填写表格了。

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

希望它能以某种方式有所帮助...


0

在使用Laragon和Laravel 4的Windows 10上工作时,在我看来,无法手动更改权限,因为chmod在Laragon-in-built-terminal中执行- 命令无效。

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

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

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

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

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


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

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


-4

我试图授予777对存储文件夹的访问权限,它对我有帮助

1)进入您的laravel根目录,(/var/www/html对我而言)并运行以下命令

chmod 777 -R storage

2
不要将权限设置为777,因为这会使所有可见目录的人都可以看到该目录并可以对其进行编辑。不建议这样做!
CodeNinja
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.