file_put_contents (meta/services.json): не удалось открыть поток: отказано в разрешении

Я новичок в Laravel. Я пытался открыть http://localhost/test/public/ и я получил

Ошибка в обработчике исключений.

Я погуглил и изменил разрешение каталога хранилища, используя 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): не удалось открыть поток: отказано в разрешении

Ответ 1

Предложение от 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

ПРИМЕЧАНИЕ: НЕ ДЕЛАЙТЕ ЭТОГО НА ЛЮБОМ ДИСТАНЦИОННОМ СЕРВЕРЕ (DEV ИЛИ ПРОИЗВОДСТВЕ)

Когда я задал этот вопрос, это была проблема на моем локальном хосте, работающем на виртуальной машине. Поэтому я подумал, что установка 777 была достаточно безопасной, однако люди правы, когда говорят, что вам следует искать другое решение. Попробуйте сначала 775

Ответ 2

Для гуглеров, столкнувшихся с этой проблемой с Laravel 5.

Это проблема разрешения, вызванная тем, что разные пользователи пытаются писать в том же файле журнала в папке storage/logs с разными разрешениями.

Что происходит, ваш конфигуратор laravel, вероятно, настроен ежедневно на журнал ошибок, поэтому ваш веб-сервер (apache/nginx) может создать этот файл под пользователем по умолчанию, в зависимости от вашей среды он может быть чем-то вроде _www на OSX или www-data on * NIX, тогда проблема возникает, когда вы, возможно, запускаете некоторые команды artisan и получаете некоторые ошибки, поэтому мастер должен записать этот файл, но с другим пользователем, поскольку PHP на терминале выполняется другим пользователем, фактически вашим пользователем входа, вы можете проверить это, выполнив эту команду:

php -i | grep USER

Если ваш пользователь входа в систему создал этот файл журнала на вашем веб-сервере, вы не сможете писать ошибки в нем, и наоборот, поскольку laravel записывает файлы журнала с разрешениями 655 по умолчанию, который позволяет владельцу писать в нем.

Чтобы исправить это временное действие, вы должны вручную предоставить разрешения для группы 664 для этого файла, чтобы и ваш пользователь входа в систему, и пользователь веб-сервера могли записывать в этот файл журнала.

Чтобы избежать этой проблемы навсегда, вы можете настроить правильные разрешения при создании нового файла в директории storage/logs, наследуя разрешения из каталога на этот ответ https://unix.stackexchange.com/a/115632 может помочь вам справиться с этим.

Ответ 3

Для всех, кто использует Laravel 5, Homestead и Mac попробуйте следующее:

mkdir storage/framework/views

Ответ 4

Вы не должны давать 777 разрешений. Это риск для безопасности. Пользователям Ubuntu, в Laravel 5, я стараюсь изменить рекурсивно менять владельца для хранения каталога:

Попробуйте следующее:

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

В системах на основе Ubuntu www-data является пользователем apache.

Ответ 5

несколько раз SELINUX вызвал эту проблему; вы можете отключить selinux с помощью этой команды.

sudo setenforce 0

Ответ 6

Проблема решена

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

это позволяет разрешать запись приложениям, фреймворкам, журналам. Надеюсь, это поможет.

Ответ 7

Для бродячих пользователей решение:

(в бродячих) php artisan cache: clear

(вне бродяг) chmod -R 777 app/storage

(в бродячем) композитор dump-autoload

Убедитесь, что вы chmod в своей локальной среде, а не внутри бродяги, важны здесь!

Ответ 8

НИКОГДА НЕ ДАЙТЕ ЕГО РАЗРЕШЕНИЕ 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 означает (ру)
наконец, для доступа к хранилищу ug + rwx означает, что вы даете пользователю и группе 7

Ответ 9

Повторите попытку с помощью chmod -R 755 /var/www/html/test/app/storage. Используйте с sudo для Operation not permitted в chmod. Используйте "Проверить разрешение владельца", если все еще есть ошибка.

Ответ 10

В соответствии с Laravel 5.4, который является последним, поскольку я пишу это, если у вас есть какие-либо проблемы, как это, вы должны изменить разрешение. НЕ СЛУШАЙТЕСЬ К ЛЮБОЙ КТО РАССКАЗЫВАЕТ ВАМ УСТАНОВИТЬ 777 ДЛЯ ЛЮБЫХ КАТАЛОГ. У этого есть проблема безопасности. Измените разрешение папки хранения следующим образом

sudo chmod -R 775 storage

Измените разрешение папки для начальной загрузки

sudo chmod -R 775 bootstrap/cache

Теперь убедитесь, что вы выполняете обе команды из своего каталога приложений. Вы не столкнетесь с проблемами в будущем относительно разрешения. 775 не ставит под угрозу безопасность вашей машины.

Ответ 11

Предложите правильное разрешение, если для Apache,

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

Ответ 12

Если у вас есть Laravel 5 и ищет постоянное решение, применимое как для командной строки php artisan, так и для сервера Apache, используйте это:

sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart

Подробное описание здесь.

Ответ 13

ДЛЯ ЛЮБОГО РАБОТЫ ОС С 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 может быть трудно справиться, но если это произойдет, я бы настоятельно рекомендовал вам изучить его, а не обходить его полностью.

Ответ 14

У меня была такая же проблема, и приведенные ниже шаги помогли мне исправить эту проблему.

  • Узнайте пользователя apache - создайте файл test.php в общей папке с кодом

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

И запустите файл из веб-браузера. Это даст пользователю apache. В моем случае это ec2-user, поскольку я использовал aws с cronjob, установленным в /etc/cron.d/. Это может быть другим пользователем для других.

  1. Запустите команду ниже в командной строке.

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

Вам нужно определить и использовать правильные "пользовательские" и "пользовательские группы" здесь.

Ответ 15

Xampp для использования:

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

Ответ 16

В любое время, когда я меняю app.php, я получаю разрешение, запрещающее писать bootstrap/cache/services.json, поэтому я сделал это, чтобы исправить его:

chmod -R 777 bootstrap/cache/

Ответ 17

rm storage/logs/laravel.log  

решил это для меня

Ответ 18

Если вы используете laradock, попробуйте chown -R laradock:www-data./storage в вашем контейнере рабочей области.

Ответ 19

В моем случае решение заключалось в изменении разрешения на каталоги app/storage/framework/views и app/storage/logs.

Ответ 20

Если кто-то другой сталкивается с аналогичной проблемой с ошибкой прав доступа 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

Ответ 21

Просто запустите свой сервер, используя artisian

php artisian serve

Затем выполните доступ к вашему проекту с указанного URL:

введите описание изображения здесь

Ответ 22

У меня такая же проблема при запуске vagrant на mac. решил проблему, изменив пользователя сервера Apache в файле https.conf:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $ 

Запустите apache под пользователем php вместо демон пользователя, чтобы решить проблему с доступом к файлу с помощью 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

У меня была аналогичная проблема. (Разрешение отклонено, а разрешения, если они настроены правильно) с Laravel 5.2 и 5.5

Проблема заключалась в том, что SELinux был включен, что предотвращает использование Apache файлов даже в режиме 777. См. Отвечайте ответ 500 Laravel (Uncaught UnexpectedValueException: Laravel.log) для ответа на вопрос и ответ.

Возможно, это решает проблему и для вас.

Ответ 24

После большого количества проб и ошибок с разрешениями каталога у меня закончилось прозрение... на диске не осталось места. Просто хотел поделиться, чтобы убедиться, что никто другой не настолько глуп, чтобы продолжать искать решение в неправильном направлении.

В Linux вы можете использовать df -h, чтобы проверить размер вашего диска и свободное пространство.

Ответ 25

Установка разрешения на 777, безусловно, ужасная идея!

... но

Если вы получаете ошибку разрешения, связанную с папкой "хранилище", то, что работало для меня:

1) Установите разрешение "Хранилище" и его подпапки на 777 с

sudo chmod -R 777 storage/

2) В браузере перейдите на домашнюю страницу laravel laravel/public/(laravel создаст необходимые начальные файлы для хранения)

3) Вернуть безопасное разрешение 775 в хранилище и его подпапки

sudo chmod -R 775 storage/

Ответ 26

Эта проблема на самом деле вызвана различными пользователями, которые хотят write/read файл, но отказано, вызывают разные права собственности. может быть, вы с правами root установили laravel до того, как войдете на свой сайт как пользователь laravel, где laravel является владельцем по умолчанию, так что это действительно реальная проблема. Таким образом, когда пользователь 'laravel' хочет прочитать/записать весь файл на диске по умолчанию, чтобы его запретили, причина в том, что этот файл принадлежит пользователю 'root'.

Для решения этой проблемы вы можете следовать так:

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

или в моем случае

sudo chown -hR igmcoid/root/sublaravel

Сноска:

  1. root как имя первого владельца который установил раньше
  2. your-user-name как владелец по умолчанию, который фактически пишет/читает на сайте.
  3. namefolder как имя папки, в которой вы хотите сменить владельца.

Ответ 27

Я получил те же ошибки в моем проекте...
Но обнаружил, что я забыл поставить enctype в моей форме.

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

Надеется, это поможет где-то как-то...

Ответ 28

Работая на Windows 10 с Laragon и Laravel 4, мне казалось, что нет никакого способа изменить разрешения вручную, так как выполнение chmod -commands в терминале Laragon-in-Built-in не имеет никакого эффекта.

Однако в этом терминале можно было перейти в папку хранилища и вручную добавить нужные папки следующим образом:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

Компакт- cd -command в терминале приводит вас к папке (вам может потребоваться изменить этот путь в соответствии с вашей файловой структурой). mkdir -command создаст каталог с указанным именем.

У меня не было возможности протестировать этот подход в Laravel 5, но я ожидаю, что подобный подход должен работать.

Конечно, может быть лучший способ, но, по крайней мере, это был разумный обходной путь для моей ситуации (исправление ошибки: file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream).

Ответ 29

Для LARAVEL 5 попробуйте создать кеш, сеансы и виды в хранилище/фреймворке с разрешением 777.

Ответ 30

Я попытался предоставить 777 доступ к папке хранения, и у меня есть работа для меня

1) перейдите в свой корневой каталог laravel, (/var/www/html для меня) и запустите следующую команду

chmod 777 -R storage