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


169

Я новачок у Ларавелі. Я намагався відкрити, 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 / скомпільовано. php: 8423

Потім я змінив дозволи довідника зберігання за допомогою команди, chmod -R 644 app/storageі помилка "Помилка в обробці винятків" зникла, і сторінка завантажується. Але там я отримую це:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): не вдалося відкрити потік: у дозволі відмовлено


2
знову схоже на проблему з
дозволом

@alou Я думаю, що я вже це зробив з chmod -R 777 додатком / сховищем. Хіба я не? І всі каталоги всередині додатка мають дозвіл drwxrwxrwx.
vishnub1626

33
Спробуйте: php artisan cache:clearтоді chmod -R 777 app/storageнарештіphp artisan dump-autoload
vsmoraes

@vsmoraes Це спрацювало. Буде дуже корисно, якщо ви зможете пояснити, в чому проблема.
vishnub1626

7
Коментар vsmoraes був правильним, однак замість 'php artisan dump-autoload' у має бути «композитор dump-autoload»
Елліот Роберт

Відповіді:


320

Пропозиція від vsmoraes працювала на мене:

Ларавель> = 5.4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload

Ларавель <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload

ПРИМІТКА: НЕ робіть цього на будь-якому сервісі, що видаляється (приладі чи виробництві)

Коли я задав це питання, це була проблема в моєму локальному хості, який працює у віртуальній машині. Тому я подумав, що встановити 777 досить безпечно, проте люди мають рацію, коли кажуть, що слід шукати інше рішення. Спробуйте спочатку 775


8
Це має бути sudo chmod -R 777 додаток / сховище. щоб уникнути помилки дозволу.
Олайтан Майова

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

Для googlers, які стикаються з цією проблемою з Laravel 5.

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

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

php -i | grep USER

Якщо ваш користувач реєстрації створив цей файл журналу на своєму веб-сервері, ви не зможете записувати в нього помилки, і навпаки, тому що laravel записує файли журналів з 655дозволами за замовчуванням, що дозволяє власнику лише писати в ньому.

Щоб виправити це тимчасове повідомлення, ви повинні вручну надати дозволу для групи 664в цьому файлі, щоб і ваш користувач, який ввійшов, і користувач веб-сервера могли записувати в цей файл журналу.

Щоб назавжди уникнути цієї проблеми, можливо, ви захочете налаштувати належні дозволи, коли новий файл створюється в режимі storage/logsdir, успадкувавши дозволи з каталогу, ця відповідь https://unix.stackexchange.com/a/115632 може допомогти вам вирішити що.


фен-фриген-смачна відповідь тут! Я працюю на Elastic Beanstalk, і мій користувач PHP командного рядка є "ec2-користувачем", але моя програма працює як "webapp".
Ренді Л

1
Відповідь, яка пояснює проблему. тобто правильна відповідь.
Craicerjack

Це допомогло мені зрозуміти, чому я отримую помилку кешу файлів у Laravel на Cloudways. Мені потрібно було натиснути кнопку на панелі Cloudways, щоб скинути дозволи файлів. Дякую.
Райан

44

Не слід давати 777 дозволів. Це ризик для безпеки. Для користувачів Ubuntu, в Laravel 5, я пропоную змінити власника для зберігання каталогів рекурсивно:

Спробуйте наступне:

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

У системах, що базуються на Ubuntu, www-data є користувачем apache.


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 btw
Yohanes Gultom

Це зробило це для мене, дякую. Я видалив увесь каталог пам’яті, думаючи, що це знову буде генеровано laravel, не знаю.
примхливий

33

інколи SELINUX спричиняв цю проблему; ви можете відключити selinux за допомогою цієї команди.

sudo setenforce 0

уау, я справді зробив трюк і працює, може хтось пояснить мені, чому це спрацювало? що таке selinux?
undefinedman

так, це справді спрацювало! будь ласка, допоможіть нам гуру щодо розуміння цього питання на SELINUX? Я використовую Fedora 24 btw
loki9

1
Дякую, дуже дякую Я шукаю в мережі, і всі кажуть мені перевірити дозвіл, перевірити користувача і так далі ...
Ali ZahediGol

3
Це в основному як вимкнення всього брандмауера, оскільки він блокував потрібний вам порт.
Teh JoE

Я ніколи про це не чув. "Linux-Enhanced Linux (SELinux) - це модуль захисту ядра Linux, який забезпечує механізм підтримки політики безпеки доступу." Я сумніваюся, що це гарна ідея вимкнути це. І я піддаюсь сумніву, що учасники змагань сліпо використовують цю команду, не розуміючи повних наслідків.
Райан

18

Проблема вирішена

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

це дозволяє дозвіл на запис програми, фреймворку, журналів. Сподіваюся, що це допоможе


12
ніколи 777 ... ні в розробниках, ні в продажі, оскільки це дасть ілюзію речей, що працюють у розробниках, але вони розіб'ються в продажі, якщо не буде 777, а це ніколи не є хорошою ідеєю
Кайл Беркетт

wooha you rock ... Продавець був той, якого я пропав
lu1s

так, давати що-небудь у відкритому
доступі

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 додаток / сховище

(in vagrant) композитор dump-autoload

Тут важливо переконатися, що ти chmod у своєму місцевому середовищі, а не в бродячому!


6
777 не занадто відкритий?
Сімо

3
Я маю на увазі, для виробництва, звичайно. Але це місцеве середовище розробників. 777 використовував оригінальний плакат, а інші відповіді.775 або 755 можуть працювати залежно.
Брендан

12

Спробуйте ще раз chmod -R 755 /var/www/html/test/app/storage. Використовуйте з судо для 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 use: sudo chown -R forge: forge ~ / проект / зберігання / sudo chown -R forge: forge ~ / проект / завантажувальна
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

Детальне пояснення дивіться тут .


8
здається, погана ідея використовувати 777
Randy L

umask 000 у резолюції.conf ?! звідки ці люди отримують цю інформацію? це недійсний рядок у resolutionv.conf. Будь ласка, ігноруйте це та всі 777 "рішення" там
higuita

перевірте URL-адресу і не знайдіть опції umask в разреш.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

Тут потрібно визначити та використати правильні "користувач" та "групу користувачів".


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 .


3

Xampp для використання:

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

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/

8
chmod 777 - це ризик для безпеки
Йогеш Камат


2

Встановити дозвіл на 777 - це, безумовно, жахлива ідея!

... але

Якщо ви отримуєте помилку дозволу, пов’язану з папкою "зберігання", це те, що працювало для мене:

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+');

Потім переконайтесь, що апач також має дозволи на запис у файл.

http://php.net/manual/en/function.fopen.php


0

Просто запустіть ваш сервер за допомогою artisian

php artisian serve

Потім перейдіть до свого проекту за вказаною URL-адресою:

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


0

У мене те саме питання, коли я запускаю бродягу на 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, може бути прочитаний і відредагований апачем, не показуючи помилки дозволу на доступ.


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">

Сподіваємось, що це десь допомагає ...


0

Під час роботи в Windows 10 з Laragon і Laravel 4 мені здалося, що немає можливості змінити дозволи вручну, оскільки виконання chmod-команд у вбудованому терміналі Laragon не вплинуло.

Однак у цьому терміналі можна було перейти до папки зберігання та вручну додати потрібні папки, як це:

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

Команда cd-команда в терміналі приведе вас до папки (можливо, вам знадобиться відрегулювати цей шлях відповідно до вашої файлової структури). mkdir-Command створить каталог із зазначеним ім'ям.

У мене не було можливості протестувати цей підхід у 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.