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

112

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

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

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

  • 2
    опять похоже на проблему с разрешением, chmod рекурсивно все каталоги приложений
  • 0
    @ Я думаю, что я уже сделал это с помощью chmod -R 777 app / storage. Не так ли? И все каталоги внутри приложения имеют разрешение drwxrwxrwx.
Показать ещё 6 комментариев
Теги:
exception
laravel-4

25 ответов

253

Предложение от 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
  • 8
    Это должно быть sudo chmod -R 777 app / storage. чтобы избежать ошибки разрешения.
  • 1
    Отлично! Работает отлично!
Показать ещё 27 комментариев
54

Для гуглеров, столкнувшихся с этой проблемой с 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 может помочь вам справиться с этим.

  • 0
    фан-фригентный ответ здесь! я работаю на Elastic Beanstalk и мой пользователь PHP командной строки "ec2-пользователь", но мое приложение работает как "веб-приложение".
  • 1
    Ответ, который объясняет проблему. т.е. правильный ответ.
Показать ещё 1 комментарий
39

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

mkdir storage/framework/views
  • 0
    Это также работает с созданием нового сервера с Laravel Forge с Laravel 5.2.7
  • 2
    Это сделало это для меня. Похоже, что bootstrap/cache/compiled.php пытался записать в этот каталог, но он не существовал и в итоге выдал ошибку прав доступа. Спасибо.
Показать ещё 2 комментария
21

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

sudo setenforce 0
  • 0
    вау, я действительно сделал свое дело и работает, может кто-нибудь объяснить мне, почему это работает? что такое selinux?
  • 0
    да, это действительно сработало! пожалуйста, помогите нам, гуру, понять это на SELINUX? Я использую Fedora 24 кстати
Показать ещё 4 комментария
19

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

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

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

  • 11
    никогда не 777 ... в dev или prod, поскольку это создаст иллюзию того, что работает в dev, но они сломаются в prod, если только 777 также не является хорошей идеей
  • 0
    Wooha ты рок ... продавец был тот, кого я скучал
Показать ещё 1 комментарий
14

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

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

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

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

  • 2
    Это исправлено для меня и является более правильным (я думаю), чем ответы chmod 777 . Благодаря ~
  • 0
    Я думаю, что это самый удобный ответ для пользователей Linux. Спасибо @GavinR. chmod 777 это полный кошмар.
Показать ещё 2 комментария
13

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

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

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

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

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

  • 6
    777 не слишком открыт?
  • 3
    Я имею в виду, для производства, конечно. Но это локальная среда разработки. 777 был тем, что использовал оригинальный плакат, и другие ответы. 775 или 755 могут работать в зависимости.
Показать ещё 1 комментарий
7

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

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

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

  • 8
    кажется плохой идеей использовать 777
  • 0
    umask 000 в resolv.conf ?! откуда эти люди получают эту информацию? это неверная строка в resolv.conf. Пожалуйста, игнорируйте это и все 777 "решений" там
Показать ещё 1 комментарий
7

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

  • 0
    Не работает. Все каталоги внутри приложения имеют разрешение drwxrwxrwx
  • 0
    @tav. Можете ли вы проверить разрешение своего владельца для вашей тестовой папки?
Показать ещё 3 комментария
6

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

sudo chown -R apache:apache apppath/app/storage
  • 0
    Использование Laravel Forge: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
5

ДЛЯ ЛЮБОЙ ОСНОВЫ ОС ОС С SELINUX: правильный способ разрешить httpd записывать в папку хранения laravel:

sudo semanage fcontext -a -t httpd_sys_rw_content '/path/to/www/storage(/.*)?'

Затем немедленно применить изменения:

sudo restorecon -F -r '/path/to/www/storage'

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

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

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

  • Узнайте пользователя 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

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

3

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

sudo chmod -R 775 storage

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

sudo chmod -R 775 bootstrap/cache

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

3
rm storage/logs/laravel.log  

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

3

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

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

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

chmod -R 777 bootstrap/cache/
  • 7
    chmod 777 - это угроза безопасности
  • 3
    не совсем, если это ваш собственный сервер
0

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

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

0

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

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

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

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, не показывая никакой ошибки разрешения доступа.

0

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

0

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

php artisian serve

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

Изображение 3551

0

В моем случае решение заключалось в изменении разрешения на каталоги 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

-3

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

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

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

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

  • 0
    Что вы подразумеваете под словом «создать», еще раз просмотрите свой ответ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню