ChatGPT解决这个技术问题 Extra ChatGPT

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

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

异常处理程序中的错误。

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

我在 app.php 中更改了 debug=>true 并访问了该页面并在异常处理程序中出现错误:

无法打开流或文件“/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):无法打开流:权限被拒绝

看起来又像许可证问题,chmod递归所有应用程序目录
@alou 我想我已经用 chmod -R 777 app/storage 做到了。我不是吗?并且app里面的所有目录都有drwxrwxrwx权限。
尝试:php artisan cache:clear 然后 chmod -R 777 app/storage 最后 php artisan dump-autoload
@vsmoraes 它奏效了。如果您能解释问题所在,那将非常有帮助。
vsmoraes 的评论是正确的,但是应该是 'composer dump-autoload' 而不是 'php artisan dump-autoload'

T
TylerH

vsmoraes 的建议对我有用:

拉拉维尔> = 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

T
TylerH

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

发生的情况是您的 Laravel 配置可能设置为每天记录错误,因此您的 Web 服务器(Apache/nginx)可能会根据您的环境在默认用户下创建此文件,它可能类似于 OSX 上的 _wwwwww-data *NIX 系统,那么当您可能运行了一些工匠命令并遇到一些错误时,问题就出现了,因此工匠将使用不同的用户编写此文件,因为终端上的 PHP 由不同的用户执行,实际上是您的登录用户,您可以通过运行以下命令检查它:

php -i | grep USER

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

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

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


R
RibeiroSt

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

尝试以下操作:

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

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


u
user9342572809

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

mkdir storage/framework/views

m
mahrad

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

sudo setenforce 0

这基本上就像关闭整个防火墙一样,因为它阻止了您需要打开的端口。
我从来没有听说过这个。 “Security-Enhanced Linux (SELinux) 是一个 Linux 内核安全模块,它提供了一种支持访问控制安全策略的机制。”我怀疑关闭它是个好主意。而且我敢打赌,支持者在不了解全部后果的情况下盲目地使用此命令。
I
Ibrahim W.

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


来自存储 laravel 的框架上的缓存怎么样?如果我们设置 775 并且无法创建新缓存,对吗?
u
user3470929

问题解决了

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

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


永远不要 777 ...在 dev 或 prod 中,因为它会产生在 dev 中工作的错觉,但除非 777 也不会出现在 prod 中,否则这绝不是一个好主意
B
Brendan

对于 vagrant 用户,解决方案是:

(在 vagrant 中)php artisan 缓存:清除

(在 vagrant 之外) chmod -R 777 app/storage

(在流浪者中)作曲家转储自动加载

确保您在本地环境中而不是在 vagrant 中进行 chmod 在这里很重要!


777不是太开放了吗?
我的意思是,对于生产,当然。但这是一个本地开发环境。 777 是原始海报使用的内容,其他答案。775 或 755 可能会起作用。
我正在使用 laravel 和 artisan 并发现关键是在 VM 上进行迁移,但是所有文件的创建都发生在主机上(我总是让 guest v.host 感到困惑,但这将是本地开发目录)。 VM = migrate(对于在那里运行的数据库,在mac上制作:我保留了我的权限并在正确的位置运行命令,没有麻烦。
K
Khay

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


不工作。 app内的所有目录都有权限drwxrwxrwx
@tav 你能检查你的测试文件夹的所有者权限吗?
同样的drwxrwxrwx。使用@vsmoraes 的建议解决了问题(见评论)
chmod 777 存在安全风险
K
Koushik Das

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

sudo chmod -R 775 storage

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

sudo chmod -R 775 bootstrap/cache

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


P
Pang

建议正确的权限,如果是 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/
H
Heather Gaye

对于使用 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 用于测试。因此,经过所有常规检查后,这篇文章实际上节省了我的时间。
这是正确的解决方案,虽然我认为正确的 SELinux 类型应该是 httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
C
Community

如果您有 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


使用 777 似乎是个坏主意
resolv.conf 中的 umask 000 ?!这些人从哪里得到这些信息?这是 resolv.conf 中的无效行。请忽略这一点以及所有 777 个“解决方案”
检查 url 并在 resolv.conf linux.die.net/man/5/resolv.conf 中找不到 umask 选项
K
KiranD

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

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

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

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

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

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

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


p
pableiros

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

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

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

php artisan view:clear

T
TylerH

Xampp 使用:

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

来自Setting Up Laravel 4.x on Mac OSX 10.8+ with XAMPP


m
malhal

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

chmod -R 777 bootstrap/cache/

chmod 777 存在安全风险
a
aad1992
rm storage/logs/laravel.log  

为我解决了这个问题


N
Nika Tsogiaidze

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

... 但

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

1) 使用 sudo chmod -R 777 storage/ 将“storage”及其子文件夹权限设置为 777 2) 在浏览器中转到 laravel 主页 laravel/public/ (laravel 将创建必要的初始存储文件) 3) 将安全 775 权限返回到 storage及其子文件夹 sudo chmod -R 775 storage/


R
Rob L

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


R
Rashed Zaman

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


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

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


F
Frank

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

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


B
Bliss Jaspis

这个问题实际上是由想要write/read文件但被拒绝的不同用户引起的,导致不同的所有权。也许您之前以“root”身份安装了 laravel,然后您以“laravel”用户身份登录您的站点,其中“laravel”是默认所有权,所以这是这里真正的问题。因此,当用户'laravel'想要默认读取/写入磁盘中的所有文件时,被拒绝,导致该文件具有'root'的所有权。

要解决此问题,您可以这样做:

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

或者在我的情况下

sudo chown -hR igmcoid /root /sublaravel

脚注:

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


您的回答实际上清楚地说明了为什么不使用 777 权限以及如何为特定实例定义新用户。我在 ubunto 上运行我的服务器,默认情况下,apache 服务器在 www-data 上运行,您可以使用命令 'ps aux | 轻松找到它。 egrep '(apache|httpd)' 然后按照上面的说明
K
Kyle Burkett

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


W
Wajih

只需使用 artisian 启动您的服务器

php artisian serve

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

https://i.stack.imgur.com/Hrop8.png


n
nigam214

在 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 读取和编辑,而不会显示任何访问权限错误。


S
Skandix

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

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

希望它以某种方式在某个地方有所帮助...


V
Virginia

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

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

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)。


M
Md. Juyel Rana

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

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


当 Laravel 生成您要删除的那些文件(存储、存储/框架、存储/框架/缓存|会话|视图)时,它会保护它们,使只有管理员操作系统用户能够读/写/执行它们,所以当你删除文件并重新创建它们可以由来宾用户更改,这是安全漏洞,您的答案是安全漏洞!