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/. Это может быть другим пользователем для других.
- Запустите команду ниже в командной строке.
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
Сноска:
-
root
как имя первого владельца который установил раньше -
your-user-name
как владелец по умолчанию, который фактически пишет/читает на сайте. -
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