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

169

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

vishnub1626
источник
2
снова выглядит как проблема с разрешением, chmod рекурсивно все каталоги приложений
alou
@ Я думаю, я уже сделал это с помощью chmod -R 777 app / storage. Не так ли? И все каталоги внутри приложения имеют разрешение drwxrwxrwx.
vishnub1626
33
Попробуйте: php artisan cache:clearпотом chmod -R 777 app/storageнаконецphp artisan dump-autoload
всмораес
@vsmoraes Это сработало. Будет очень полезно, если вы сможете объяснить, в чем проблема.
vishnub1626
7
Комментарий vsmoraes был правильным, однако вместо 'php artisan dump-autoload' должно быть 'composer dump-autoload'
Эллиот Роберт

Ответы:

320

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

ecairol
источник
8
Это должно быть sudo chmod -R 777 app / storage. чтобы избежать ошибки разрешения.
Олайтан Майова,
5
Для # Laravel5 инструкции почти идентичны: php artisan cache:clearтогда chmod -R 777 storageи потом composer dump-autoload
WNRosenberg
6
Если вы используете Laravel вам 5.1 + нужно сделать chmod -R 777 storageвместо этого
Джеймс
10
php artisan cache:clearэто правильный ответ. Затем sudo chmod -R ug+rw storageдает правильные разрешения для меня, не даваяothers
Зак Моррис
43
Этот ответ и тема подчеркивают, почему мне так не нравится Laravel: он учит разработчиков, что вы можете делать все, что захотите, когда захотите, так быстро, как захотите, не думая о последствиях (я понимаю, 777это не относится к Laravel, но мыслительный процесс для разработчиков Laravel: «сделай так, чтобы он работал СЕЙЧАС, мне все равно, как», просто так 777). Как правило, никогда, никогда не устанавливайте что-либо, 777чтобы заставить что-то работать. ПОНИМАЙТЕ свой сервер и пользователей / роли и устанавливайте их соответствующим образом; не взламывайте это. Ваши клиенты доверяют вам сделать это правильно.
dKen
70

Для Google, которые столкнулись с этой проблемой в Laravel 5.

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

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

php -i | grep USER

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

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

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

Адриано Роза
источник
фан-фригентный ответ здесь! я работаю на Elastic Beanstalk и мой пользователь PHP командной строки "ec2-пользователь", но мое приложение работает как "веб-приложение".
Рэнди Л
1
Ответ, который объясняет проблему. т.е. правильный ответ.
Craicerjack
Это помогло мне понять, почему я получаю ошибку файлового кэша в Laravel на Cloudways. Мне нужно было нажать кнопку на панели Cloudways, чтобы сбросить права доступа к файлам. Спасибо.
Райан
44

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

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

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

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

RibeiroSt
источник
2
Это исправлено для меня и является более правильным (я думаю), чем chmod 777ответы. Спасибо ~
GavinR
Я думаю, что это самый удобный ответ для пользователей Linux. Спасибо @GavinR. chmod 777это полный кошмар.
Абдалла Арбаб
Это сработало для меня и определенно является лучшим вариантом, чем chmod -777
Egnaro
Спасибо за новый способ решения проблемы! Нужно ли что-то делать до / после вашей команды, чтобы исправить chmod 777последствия?
Александр
41

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

mkdir storage/framework/views
Ханс П
источник
Это также работает с созданием нового сервера с Laravel Forge с Laravel 5.2.7
winkster
2
Это сделало это для меня. Кажется, что bootstrap/cache/compiled.phpпытался записать в этот каталог, но он не существовал и в результате выдает ошибку разрешений. Спасибо.
Мэтт К
1
Каким-то образом это сработало для меня. Я использую laravel 5.1 между прочим
Йоханес Гултом
Это сделало это для меня, спасибо. Я удалил весь каталог хранения, думая, что он снова будет сгенерирован laravel, не думаю.
Grimmdude
33

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

sudo setenforce 0
mahrad
источник
вау, я действительно сделал свое дело и работает, может кто-нибудь объяснить мне, почему это работает? что такое selinux?
undefinedman
да, это действительно сработало! пожалуйста, помогите нам, гуру, понять это на SELINUX?
Я
1
Спасибо, большое спасибо. Я ищу в сети, и все говорят мне, чтобы проверить разрешение, проверить пользователя и так далее ...
Али ZahediGol
3
Это в основном похоже на отключение всего брандмауэра, потому что он блокировал порт, который вам нужно было открыть.
Джо
Я никогда не слышал об этом. «Security-Enhanced Linux (SELinux) - это модуль безопасности ядра Linux, который обеспечивает механизм поддержки политик безопасности контроля доступа». Я сомневаюсь, что это хорошая идея, чтобы выключить его. Бьюсь об заклад, апвоттеры слепо используют эту команду, не понимая всех последствий.
Райан
18

Задача решена

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

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

user3470929
источник
12
никогда не 777 ... в dev или prod, поскольку это создаст иллюзию того, что все работает в dev, но они сломаются в prod, если только 777 также не является хорошей идеей
Кайл Беркетт
wooha ты рок ... продавец был тот, кого я пропустил
lu1s
да, давать что-либо в общедоступной сети 777 - плохая идея
imabug
17

НИКОГДА НЕ ДАЙТЕ ЕГО РАЗРЕШЕНИЕ 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

Ибрагим В.
источник
1
я не знаю, почему многим разработчикам нравится использовать 777 ... как-то они не заботятся о своей системе ..
ZeroOne
15

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

(в бродяге) PHP кеш ремесленника: очистить

(вне бродяги) chmod -R 777 приложение / хранилище

(в бродяге) композитор дамп-автозагрузка

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

Brendan
источник
6
не слишком ли открыт 777?
Симо
3
Я имею в виду, для производства, конечно. Но это локальная среда разработки. 777 был тем, что использовал оригинальный плакат, и другие ответы. 775 или 755 могут работать в зависимости.
Брендан
12

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

Хай
источник
Не работает. Все каталоги внутри приложения имеют разрешение drwxrwxrwx
vishnub1626
@tav. Можете ли вы проверить разрешение своего владельца для вашей тестовой папки?
Хай
Тот же drwxrwxrwx. Решил проблему, используя предложения @ vsmoraes (см. Комментарии)
vishnub1626
4
chmod 777 - это
угроза
9

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

sudo chmod -R 775 storage

Измените разрешение на загрузочную папку следующим образом

sudo chmod -R 775 bootstrap/cache

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

Кушик дас
источник
7

Предложите правильное разрешение, если для 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 /
Flappy
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

Смотрите подробное объяснение здесь .

alexeydemin
источник
8
кажется плохой идеей использовать 777
Randy L
umask 000 в resolv.conf ?! откуда эти люди получают эту информацию? это неверная строка в resolv.conf. Пожалуйста, игнорируйте это и все 777 «решений» там
higuita
проверьте URL и не найдите опцию umask в resolv.conf linux.die.net/man/5/resolv.conf
higuita
6

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

Хизер Гэй
источник
моя точная проблема в свежих сентос 7 была похожа. он говорил, что нет разрешения писать, но все были 777 для тестирования. Так что этот пост фактически сэкономил мое время после всех общих проверок.
HumaN
1
Это правильное решение, хотя я думаю, что правильный тип SELinux должен быть httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug
4

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

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

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

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

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

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

Вам необходимо определить и использовать правильные «пользователь» и «пользовательская группа» здесь.

KiranD
источник
4

Если вы используете 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 .

Rasheduzzaman
источник
3

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

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
cristianojeda
источник
1
Вы можете сказать это немного больше?
Аарон Холл
Я использую эту статью, и я был: Настройка Laravel 4.x на Mac OSX 10.8+ с XAMPP
cristianojeda
3
chmod 777 - это
угроза
1
Вы также можете использовать этот chmod 775
cristianojeda
2

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

chmod -R 777 bootstrap/cache/
malhal
источник
8
chmod 777 - это
угроза
2
rm storage/logs/laravel.log  

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

aad1992
источник
2

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

... но

Если вы получаете ошибку разрешения, связанную с папкой «storage», вот что у меня сработало:

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

sudo chmod -R 777 storage/

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

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

sudo chmod -R 775 storage/
Ника Цогяидзе
источник
2

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

Роб Л
источник
1

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

логово
источник
0

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

Кайл Беркетт
источник
0

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

php artisian serve

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

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

wajih
источник
0

У меня та же проблема при запуске 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 без каких-либо ошибок прав доступа.

nigam214
источник
0

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

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

Фрэнк
источник
0

Эта проблема на самом деле вызвана различными пользователями, которые хотят 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 В качестве имени папки, которую вы хотите изменить владельца.
Блаженство яспис
источник
0

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

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

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

VPA
источник
0

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

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

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

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

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

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

Виргиния
источник
-1
  1. Сначала удалите папку хранилища, затем снова создайте папку хранилища.
  2. Внутри папки хранения создайте новое имя папки в качестве фреймворка.
  3. Внутри фреймворка создайте три папки с именами в виде кеша, сессий и представлений.

Я решил свою проблему, сделав это.

М-р Джуел Рана
источник
-4

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

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

chmod 777 -R storage
Юр Гаспарян
источник
2
Не устанавливайте разрешения на 777, так как это делает каталог видимым и редактируемым для всех, кто может видеть каталог. Это не рекомендуется!
CodeNinja