首页 文章

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

提问于
浏览
148

我是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 更改了存储目录的权限,并且'Error in exception handler'错误消失了并且加载了一个页面 . 但在那里我得到了这个:

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

29 回答

  • 0

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

    (在vagrant中)php artisan cache:清楚

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

    (在vagrant中)composer dump-autoload

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

  • 4

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

  • 6

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

    mkdir storage/framework/views
    
  • 0

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

    试试以下内容:

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

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

  • 3

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

    sudo setenforce 0
    
  • 6

    问题解决了

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

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

  • 6

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

    这是由于不同用户尝试使用不同权限在 storage/logs 文件夹中的同一日志文件中写入而导致的权限问题 .

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

    php -i | grep USER
    

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

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

    要永久避免此问题,您可能需要在 storage/logs dir中创建新文件时设置适当的权限,方法是继承该目录的权限,此答案可以帮助您解决这个问题 .

  • 64

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

    NOTE: DO NOT DO THIS ON ANY REMOTE SERVER (DEV OR PRODUCTION)

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

  • 297

    永远不会给予许可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 Execute, 2 Write, 4 Read
    1 2 4 = 7表示(rwx)
    2 4 = 6表示(rw)
    最后,对于存储访问,ug rwx意味着你给用户和组7

  • 41

    根据Laravel 5.4,这是我写的最新版本,如果您有任何这样的问题,您需要更改权限 . DO NOT LISTEN TO ANYONE WHO TELLS YOU TO SET 777 FOR ANY DIRECTORY. 它存在安全问题 . 像这样更改存储文件夹的权限

    sudo chmod -R 775 storage
    

    像这样更改bootstrap文件夹权限

    sudo chmod -R 775 bootstrap/cache
    

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

  • 2

    如果你有 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 .

  • 0

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

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

    对于任何使用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可能很难处理,但如果它存在,那么我强烈建议你学习它而不是完全绕过它 .

  • 2

    我有同样的问题,以下步骤帮我解决了这个问题 .

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

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

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

    • 在命令行上运行以下命令 .

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

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

  • 34

    Xampp使用:

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

    任何时候我更改app.php我得到一个权限否认编写bootstrap / cache / services.json所以我这样做是为了解决它:

    chmod -R 777 bootstrap/cache/
    
  • 0
    rm storage/logs/laravel.log
    

    为我解决了这个问题

  • -2

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

  • 8

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

  • 28

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

  • 2

    只需使用 artisian 启动服务器

    php artisian serve

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

    enter image description here

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

  • 0

    我遇到了类似的问题 . (使用Laravel 5.2和5.5时,权限配置正确时权限被拒绝)

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

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

  • 0

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

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

  • 15

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

    ......但是

    如果您获得与“storage”文件夹相关的权限错误,那么这对我有用:

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

  • -3

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

  • 0

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

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

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

  • 10

    对于LARAVEL 5,尝试在777权限的存储/框架中创建 cachesessionsviews 文件夹 .

  • 10

    我试图给 777 访问存储文件夹,它对我有用

    1)转到laravel根目录,(对我来说是 /var/www/html )并运行以下命令

    chmod 777 -R storage
    

相关问题