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

vis*_*626 162 php exception laravel laravel-4

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

异常处理程序出错.

我用Google搜索并更改了存储目录的权限,chmod -R 777 app/storage但无济于事.

我改变debug=>trueapp.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):无法打开流:权限被拒绝

eca*_*rol 313

vsmoraes的建议为我工作:

Laravel> = 5.4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

Laravel <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

注意:请勿在任何远程服务器(设备或生产)上进行此操作

当我问这个问题时,这是我的localhost上的一个问题,在虚拟机中运行.所以我认为设置一个777足够安全,然而,当他们说你应该寻找一个不同的解决方案时,人们是对的.先试试775

  • 这个答案和主题突出了我为什么不喜欢Laravel的原因:它教会开发人员,你可以随心所欲地做任何你想做的事情,而不考虑后果(我明白`777`不是Laravel具体而言,Laravel开发人员的思维过程是:"现在让它工作,我不在乎怎么样",就像`777`).作为一般规则,永远不要将任何东西设置为"777"以使某些东西起作用.了解您的服务器和用户/角色并相应地进行设置; 不要破解它.您的客户信任您这样做. (41认同)
  • ```php artisan cache:clear```是正确的答案.然后```sudo chmod -R ug + rw storage```为我提供了正确的权限,*没有给```others```读/写或特别是执行权限.* (9认同)
  • 这应该是sudo chmod -R 777 app/storage.避免权限错误. (8认同)
  • 如果您使用的是Laravel 5.1+,则需要使用`chmod -R 777 storage` (6认同)
  • 对于#Laravel5,说明几乎相同:`php artisan cache:clear`,然后`chmod -R 777 storage`,然后`composer dump-autoload` (5认同)
  • 无论是否有效,这都不应该被投赞成票.`777`是一个坏主意,也是你应该解决的其他问题的症状. (4认同)
  • 设置777是一个坏习惯,考虑将组设置为您的Web服务器用户,并仅授予该组写入该文件夹的权限.请查看以下答案:http://stackoverflow.com/a/372​​66353/987864 (4认同)
  • chmod 777通常具有极高风险的安全风险.chmod 775的存储文件夹很好.考虑用户所属的组是Web服务器组.-R具有极高的风险,因为对于文件,根本不需要执行权限.chmod 664里面的文件. (3认同)
  • @Okipa我可能知道为什么我永远不应该给予777许可?我用的太多了...但我想知道为什么我不应该给它. (3认同)
  • @dKen 但是 `Laravel` 并没有教会我你说什么,我认为你所说的与 `Laravel` 完全无关。 (3认同)
  • @Okipa如果你要批评答案,至少提供一个更好的解决方案. (2认同)

Adr*_*osa 68

对于使用Laravel 5一直面临此问题的googlers.

这是由尝试在storage/logs具有不同权限的文件夹中的同一日志文件中写入的不同用户引起的权限问题.

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

php -i | grep USER
Run Code Online (Sandbox Code Playgroud)

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

要修复此临时文件,您必须手动将该组的权限授予 664此文件,以便您的登录用户和Web服务器用户都可以写入该日志文件.

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

  • 一个可以解释问题的答案。即正确的答案。 (2认同)

小智 41

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

mkdir storage/framework/views
Run Code Online (Sandbox Code Playgroud)

  • 这样做对我来说.似乎`bootstrap/cache/compiled.php`试图写入此目录,但它不存在并最终抛出权限错误.谢谢. (2认同)

小智 40

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

试试以下内容:

sudo chown -R www-data:www-data storage
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我来说是固定的,并且比`chmod 777`答案更正确(我认为).谢谢〜 (2认同)

小智 32

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

sudo setenforce 0
Run Code Online (Sandbox Code Playgroud)

  • 这基本上就像关闭整个防火墙一样,因为它阻止了你需要打开的端口. (3认同)

小智 18

问题解决了

php artisan cache:clear
sudo chmod -R 777 vendor storage
Run Code Online (Sandbox Code Playgroud)

这启用了应用程序,框架,日志的写入权限希望这将有所帮助

  • 从来没有777 ......在开发或生产中,因为它会给出开发工作的错觉,但是除非777也不会是一个好主意,否则它们会在生产中打破 (11认同)

Bre*_*dan 15

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

(在vagrant中)php artisan cache:清楚

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

(在vagrant中)composer dump-autoload

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

  • 是不是太开放了? (6认同)
  • 我的意思是,对于生产,当然.但这是一个本地开发环境.777是原始海报使用的,其他答案.775或755可能依赖. (3认同)

Ibr*_* W. 14

永远不要给予许可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
Run Code Online (Sandbox Code Playgroud)

这样你就可以让你的用户成为所有者并给予权限:
1执行,2写,4读
1 + 2 + 4 = 7表示(rwx)
2 + 4 = 6表示(rw)
最后,对于存储访问,ug + rwx表示您为用户和组提供了7

  • 我不知道为什么很多开发人员喜欢使用 777...不知何故他们不关心他们的系统.. (2认同)

Kha*_*hay 12

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

  • chmod 777存在安全风险 (4认同)

Kou*_*Das 9

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

sudo chmod -R 775 storage
Run Code Online (Sandbox Code Playgroud)

像这样更改bootstrap文件夹权限

sudo chmod -R 775 bootstrap/cache
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ean 7

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

sudo chown -R apache:apache apppath/app/storage
Run Code Online (Sandbox Code Playgroud)


ade*_*min 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

见详细说明这里.

  • 使用777似乎是个坏主意 (8认同)

Hea*_*aye 6

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

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
Run Code Online (Sandbox Code Playgroud)

然后立即应用更改:

sudo restorecon -F -r '/path/to/www/storage'
Run Code Online (Sandbox Code Playgroud)

SELinux可能很难处理,但如果它存在,那么我强烈建议你学习它而不是完全绕过它.


小智 6

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

 php artisan cache:clear 
 sudo chmod -R 777 storage
 composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 Windows,则可以使用git bash.

 php artisan cache:clear 
 chmod -R 777 storage
 composer dump-autoload
Run Code Online (Sandbox Code Playgroud)

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

  • Rashed,您是否知道人们可能会因您的解决方案而损失数百万美元?你的解决方案是一个严重的安全漏洞,你允许操作系统的来宾用户(很可能是黑客)读取/写入/执行你的 laravel 项目的存储! (3认同)
  • 不要听任何人告诉您为任何目录设置 777 的说法 (2认同)

Kir*_*anD 5

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

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

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

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

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

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

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


pab*_*ros 5

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

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

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

php artisan view:clear
Run Code Online (Sandbox Code Playgroud)