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

时间:2014-05-08 11:10:23

标签: php exception laravel laravel-4

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

  

异常处理程序出错。

我用Google搜索并使用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):   无法打开流:权限被拒绝

33 个答案:

答案 0 :(得分:306)

来自 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

答案 1 :(得分:64)

对于使用Laravel 5遇到此问题的googlers。

这是由于不同用户尝试使用不同权限在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可以帮助您解决问题这一点。

答案 2 :(得分:41)

对于使用Laravel 5,Homestead和Mac的每个人都试试这个:

mkdir storage/framework/views

答案 3 :(得分:37)

您不应该授予777权限。这是一个安全风险。 对于Ubuntu用户,在Laravel 5中,我sugest以递归方式更改目录存储的所有者:

尝试以下操作:

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

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

答案 4 :(得分:30)

有时候SELINUX引起了这个问题; 你可以用这个命令禁用selinux。

sudo setenforce 0

答案 5 :(得分:18)

问题解决了

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

这启用了对app,framework,logs的写入权限希望这会有帮助

答案 6 :(得分:15)

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

(在vagrant中)php artisan cache:clear

(流浪者之外)chmod -R 777 app / storage

(在vagrant中)composer dump-autoload

确保你在当地环境中而不是在流浪者中进行chmod非常重要!

答案 7 :(得分:12)

永远不要给予他许可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

答案 8 :(得分:12)

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

答案 9 :(得分:8)

根据Laravel 5.4,这是我写的最新内容,如果您有任何这样的问题,您需要更改权限。 不要听任何人告诉你为任何目录设置777。 它有一个安全问题。 像这样更改存储文件夹的权限

sudo chmod -R 775 storage

像这样更改bootstrap文件夹权限

sudo chmod -R 775 bootstrap/cache

现在请确保您正在执行应用程序目录中的两个命令。关于许可,您将来不会遇到问题。 775不会危及您机器的任何安全性。

答案 10 :(得分:7)

建议正确的权限,如果是Apache,

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

答案 11 :(得分: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

查看详细解释here

答案 12 :(得分: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可能很难处理,但如果它存在,那么我强烈建议你学习它而不是完全绕过它。

答案 13 :(得分:4)

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

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

    \e[2;1'z

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

    1. 在命令行上运行以下命令。
    2. \e['|

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

答案 14 :(得分:3)

使用Xampp:

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

答案 15 :(得分:2)

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

答案 16 :(得分:2)

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

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

我解决了它使用以下 view 命令清理 artisan 的缓存目录:

php artisan view:clear

答案 17 :(得分:2)

rm storage/logs/laravel.log  

为我解决了这个问题

答案 18 :(得分:2)

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

chmod -R 777 bootstrap/cache/

答案 19 :(得分:1)

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

答案 20 :(得分:0)

只需使用artisian

启动服务器即可

php artisian serve

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

enter image description here

答案 21 :(得分:0)

如果有其他人遇到与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

答案 22 :(得分:0)

在mac上运行vagrant时遇到同样的问题。通过在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读取和编辑,而不会显示任何访问权限错误。

答案 23 :(得分:0)

我有类似的问题。 (在配置正确的权限时权限被拒绝)与Laravel 5.2和5.5

问题在于SELinux已启用,即使使用777模式也会阻止Apache写入文件。有关问题和答案,请参阅Solve 500 response Laravel (Uncaught UnexpectedValueException: Laravel.log)

也许这也解决了你的问题。

答案 24 :(得分:0)

在对目录权限进行了大量试验和错误后,我最终得到了一个顿悟...磁盘的分区上没有剩余空间。只是想分享,以确保没有其他人愚蠢到足以继续寻找错误方向的解决方案。

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

答案 25 :(得分:0)

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

......但是

如果您获得与"存储"相关的权限错误对我有用的文件夹:

  

1)设置"存储"及其子文件夹权限777与

sudo chmod -R 777 storage/
     

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

     

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

sudo chmod -R 775 storage/

答案 26 :(得分:0)

  

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

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

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

答案 27 :(得分:0)

在带有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)。

答案 28 :(得分:0)

如果您使用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

答案 29 :(得分:0)

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

这样做可以解决我的问题。

答案 30 :(得分:0)

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

<块引用>

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

答案 31 :(得分:-2)

对于LARAVEL 5,尝试使用777权限在存储/框架中创建缓存会话视图文件夹。

答案 32 :(得分:-4)

我试图让777访问存储文件夹并且它可以为我工作

1)转到你的laravel根目录,(/var/www/html代表我)并运行以下命令

chmod 777 -R storage