「laravel.log」无法打开:打开流失败。

22

我已经在本地OSX机器上设置了Laravel Homestead,一切似乎都顺利进行,直到我尝试打开example.app:8000时出现了以下错误:

Error in exception handler: The stream or file "/home/vagrant/Code/example/app/storage/logs/laravel.log" could not be opened: failed to open stream: Protocol error in /home/vagrant/Code/example/bootstrap/compiled.php:8671

我按照Laravel文档以及关于设置Homestead的Laracast进行了跟随,所以我不确定是什么原因导致了这个问题。我可以看到/home/vagrant/Code/example/app/storage/logs/laravel.log不存在,但我认为这应该会自动创建吧?

6个回答

77

所有位于 app/storage 下的文件和文件夹应该由你和 www-data 组(即 web 服务器)拥有 可写 权限。

异常处理程序中的错误:无法打开流或文件“laravel/app/storage/logs/laravel.log”:在 laravel/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php 的第 77 行中,打开流失败:权限被拒绝

如果在访问您的网站时在浏览器中遇到此错误(或类似的错误),则组 www-data 无法写入 app/storage。如果在执行某些 php artisan 命令时出现此错误,则您(用户)无法写入 app/storage。因此,您和 www-data 组都必须具备写入权限。


为确保文件和文件夹具有正确的权限:

  1. 转到 Laravel 安装的根目录(其中包含 composer.jsonartisan)。

  2. 更改所属用户和组,其中 yourusername 是您的用户名:

    sudo chown -R yourusername:www-data app/storage
    

    这个命令会递归地(-R)将所有从app/storage开始的文件和文件夹的用户:组所有者设置为yourusername:www-data

  3. 同时为你和www-data组添加写权限:

    sudo chmod -R ug+w app/storage
    

    这将递归地 (-R) 向拥有从 app/storage 开始的文件和文件夹的用户 (u) 和组 (g) 添加写入标志 (w)。

  4. 另外,有些人建议您可能需要清除应用程序缓存。

  5. php artisan cache:clear
    
  6. 最后,您可能希望重新生成Composer的autoload文件。

  7. composer dump-autoload
    

这是最好的选择,但是给存储分配777权限,它只在特定日期工作,但当新错误在其他日期生成时,日志将由www-data创建,因此再次抛出权限错误。 但是@Virtlink,这样在生产服务器上给予www-data写入权限是否安全?我们的代码会安全吗? - Tarunn
5
尝试更改所属用户/组时,我一直收到“非法组名”错误提示。 - Tyler
对于我的情况,问题出在SELinux上。使用“sudo setenforce 0”命令解决了它。 - Dr. Ehsan Ali
我们使用cPanel环境。我们的Web请求不是由www-data运行,而是由活动用户或“nobody”用户运行。因此,“chgrp www-data”无法工作。 - Jay Bienvenu
这个解决方案只适用于Linux吗?在Mac上我得到了“chown: www-data: illegal group name”的错误。 - Matt
显示剩余3条评论

4
您需要执行以下之一:
  • sudo chmod -R 644 app/storage
  • sudo chmod -R 755 app/storage
这将更改 "app/storage" 目录的权限。

sudo chmod -R 644 app/storage 解决了错误,但现在我只看到一个空白的白色页面。当我尝试编辑 app/routes.php 时,我会收到权限被拒绝的错误。我是不是在某种程度上搞砸了整个权限? - Josh Mountain
请参考以下链接以获取更多信息:https://dev59.com/oWAg5IYBdhLWcg3wlb1h 或 https://dev59.com/X2Qn5IYBdhLWcg3wNkw4 - Chirag Shah
23
@ChiragShah 提供这样的命令(尤其是涉及权限的命令)却没有解释,这有点不负责任。当他的系统出现问题时,你只是简单地指向其他答案。懒惰。请注意改善。 - Luke

4

对于我来说,我已经使用 chmod -R 777 storage 更改了我的存储权限,并且它工作得很好。

然而,设置 777 权限非常危险,除了本地机器之外,不应在任何服务器上执行此操作。

我已在这里检查了此配置。


6
人们一再告诉我们,“777”是所有问题的答案,但实际上不是,不是,还是不是。Linux系统没有无缘无故地建立这种权限配置。777并不意味着中了大奖,它只是表示您将所有文件的所有权限授予任何用户。请访问Marco撰写的精彩答案https://askubuntu.com/a/20110/700927,您就会明白我的意思。 - Bikal Basnet

2
如果按照其他答案所述更改文件权限没有起作用,并且您正在使用CentOS 7或RHEL,则问题可能是一个名为selinux的安全程序。在注意到user3670777在Laravel 4: Failed to open stream: Permission denied的回答之前,我一直在苦苦挣扎于各种权限和组。希望这可以帮助其他人。

0
如果以上所有建议都无效,请禁用您的selinux并重试。

-6

我在Laravel方面还比较新手。也许我无法深入解释,但是这个命令解决了我的问题。

chmod -R 777 storage/

1
正如其他评论所指出的那样,这是一个危险的解决方案。有点像把你家的前门拆掉让邮递员可以送包裹一样。 - charliefortune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接