file_put_contents (meta / services.json): nie udało się otworzyć strumienia: odmowa uprawnień

169

Jestem nowy w Laravel. Próbowałem się otworzyć http://localhost/test/public/i dostałem

Błąd w obsłudze wyjątków.

Przeszukałem go i zmieniłem uprawnienia do katalogu przechowywania, chmod -R 777 app/storageale bezskutecznie.

Zmieniłem debug=>truesię app.phpi odwiedził stronę i mam błąd w obsługi wyjątków:

Nie można otworzyć strumienia lub pliku „/var/www/html/test/app/storage/logs/laravel.log”: otwarcie strumienia nie powiodło się: Odmowa uprawnień w / var / www / html / test / bootstrap / compiled. php: 8423

Następnie zmieniłem uprawnienia katalogu przechowywania za pomocą polecenia chmod -R 644 app/storagei błąd „Błąd obsługi wyjątków” zniknął i strona została załadowana. Ale tam otrzymuję to:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): nie udało się otworzyć strumienia: Odmowa dostępu

vishnub1626
źródło
2
wygląda na to, że znowu problem z
uprawnieniami
@alou Myślę, że już to zrobiłem z chmod -R 777 app / storage. Prawda? Wszystkie katalogi wewnątrz aplikacji mają uprawnienia drwxrwxrwx.
vishnub1626
33
Spróbuj: php artisan cache:clearwtedy chmod -R 777 app/storagewreszciephp artisan dump-autoload
vsmoraes
@vsmoraes To zadziałało. Będzie bardzo pomocne, jeśli możesz wyjaśnić, na czym polegał problem.
vishnub1626
7
Komentarz vsmoraes był poprawny, jednak zamiast „php artisan dump-autoload” powinno być „composer dump-autoload”
Elliot Robert

Odpowiedzi:

320

Sugestia vsmoraes zadziałała dla mnie:

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

UWAGA: NIE ROBIĆ TEGO NA ŻADNYM ZDALNYM SERWERZE (URZĄDZENIE LUB PRODUKCJA)

Kiedy zadałem to pytanie, był to problem na moim hoście lokalnym, działającym na maszynie wirtualnej. Pomyślałem więc, że skonfigurowanie 777 jest wystarczająco bezpieczne, jednak ludzie mają rację, kiedy mówią, że powinieneś poszukać innego rozwiązania. Najpierw spróbuj 775

ecairol
źródło
8
Powinno to być aplikacja / pamięć masowa sudo chmod -R 777. aby uniknąć błędu pozwolenia.
Olaitan Mayowa
5
Dla # Laravel5 instrukcje są prawie identyczne: php artisan cache:clearwtedy chmod -R 777 storage, a potem composer dump-autoload
WN Rosenberg
6
Jeśli używasz laravel 5.1+ musisz zrobić chmod -R 777 storagezamiast
James
10
php artisan cache:clearto poprawna odpowiedź. Następnie sudo chmod -R ug+rw storagedaje mi odpowiednie uprawnienia, bez nadawaniaothers
Zack Morris
43
Ta odpowiedź i wątek są tym, co podkreśla, dlaczego tak bardzo nie lubię Laravel: uczy programistów, że możesz robić, co chcesz, kiedy chcesz, tak szybko, jak chcesz, bez zastanawiania się nad konsekwencjami (rozumiem, że 777Laravel nie jest specyficzny, ale proces myślowy dla programistów Laravel jest następujący: „zrób to TERAZ, nie obchodzi mnie jak”, po prostu 777). Z zasady nigdy, przenigdy nie ustawiaj niczego, 777aby coś zadziałało. ZROZUMIEĆ serwer i użytkowników / role i odpowiednio je ustawić; nie rób tego. Twoi klienci ufają, że zrobisz to dobrze.
dKen
70

Dla pracowników Google, którzy mieli ten problem z Laravel 5.

Jest to problem z uprawnieniami spowodowany przez różnych użytkowników próbujących pisać w tym samym pliku dziennika w storage/logsfolderze z różnymi uprawnieniami.

Co się dzieje, jeśli twoja konfiguracja laravel jest prawdopodobnie ustawiona tak, aby codziennie rejestrować błędy i dlatego twój serwer WWW (apache / nginx) może utworzyć ten plik dla domyślnego użytkownika, w zależności od środowiska, może to być coś w rodzaju _wwwOSX lub www-datasystemów * NIX, wtedy problem pojawia się, gdy mogłeś uruchomić jakieś polecenia rzemieślnika i napotkałeś błędy, więc rzemieślnik napisze ten plik, ale z innym użytkownikiem, ponieważ PHP na terminalu jest wykonywane przez innego użytkownika, a właściwie twojego użytkownika logowania, możesz to sprawdzić, uruchamiając to polecenie :

php -i | grep USER

Jeśli użytkownik logujący się utworzył ten plik dziennika na serwerze sieciowym, nie będzie można w nim zapisywać błędów i odwrotnie, ponieważ laravel domyślnie zapisuje pliki dziennika z 655uprawnieniami, które pozwalają tylko właścicielowi na zapis.

Aby naprawić ten 664plik tymczasowy, musisz ręcznie nadać grupie uprawnienia do tego pliku, aby zarówno użytkownik logujący się, jak i użytkownik serwera WWW mogli zapisywać w tym pliku dziennika.

Aby uniknąć tego problemu na stałe, możesz chcieć ustawić odpowiednie uprawnienia podczas tworzenia nowego pliku w katalogu storage/logs, dziedzicząc uprawnienia z katalogu, ta odpowiedź https://unix.stackexchange.com/a/115632 może pomóc w rozwiązaniu problemu że.

Adriano Rosa
źródło
fan-friggen-tastic odpowiedź tutaj! Korzystam z Elastic Beanstalk, a moim użytkownikiem PHP z wiersza poleceń jest „ec2-user”, ale moja aplikacja działa jako „webapp”.
Randy L
1
Odpowiedź, która wyjaśnia problem. tj. poprawna odpowiedź.
Craicerjack
Pomogło mi to zrozumieć, dlaczego otrzymuję błąd pamięci podręcznej plików w Laravel na Cloudways. Musiałem nacisnąć przycisk w panelu Cloudways, aby zresetować uprawnienia do plików. Dzięki.
Ryan
44

Nie powinieneś nadawać 777 uprawnień. To zagrożenie bezpieczeństwa. Użytkownikom Ubuntu w Laravel 5 proponuję rekursywną zmianę właściciela katalogu:

Spróbuj wykonać następujące czynności:

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

W systemach opartych na Ubuntu www-data jest użytkownikiem apache.

RibeiroSt
źródło
2
To naprawione dla mnie i jest bardziej poprawne (myślę) niż chmod 777odpowiedzi. Dzięki ~
GavinR
Myślę, że to najwygodniejsza odpowiedź dla użytkowników Linuksa. Dzięki @GavinR. chmod 777to kompletny koszmar.
Abdalla Arbab,
To zadziałało dla mnie i jest zdecydowanie lepszą opcją niż chmod -777
Egnaro
Dziękuję za nowy sposób rozwiązania problemu! Czy musimy coś zrobić przed / po Twoim poleceniu, aby odwrócić chmod 777konsekwencje?
Aleksandar
41

Dla wszystkich użytkowników Laravel 5, Homestead i Mac spróbuj tego:

mkdir storage/framework/views
Hans P
źródło
Działa to również przy tworzeniu nowego serwera z Laravel Forge z Laravel 5.2.7
winkster
2
Zrobiło to dla mnie. Wygląda na to, że bootstrap/cache/compiled.phppróbowałem pisać do tego katalogu, ale on nie istniał i spowodował błąd uprawnień. Dziękuję Ci.
Matt K
1
Jakoś to zadziałało. Używam laravel 5.1 btw
Yohanes Gultom
Zrobiło to dla mnie, dzięki. Usunąłem cały katalog, myśląc, że zostanie on ponownie wygenerowany przez laravel, chyba nie.
grimmdude
33

czasami SELINUX powodował ten problem; możesz wyłączyć selinux za pomocą tego polecenia.

sudo setenforce 0
Mahrad
źródło
wow, naprawdę udało mi się i działa, czy ktoś może mi wyjaśnić, dlaczego zadziałało? co to jest selinux?
undefinedman
tak, to naprawdę zadziałało! pomóż nam, guru, w zrozumieniu tego na SELINUX? używam fedory 24 btw
loki9
1
Dziękuję, bardzo dziękuję. Przeszukuję sieć i wszyscy mówią, żebym sprawdził uprawnienia, sprawdził użytkownika i tak dalej ...
Ali ZahediGol
3
Jest to w zasadzie jak wyłączenie całej zapory, ponieważ blokowała ona port, którego potrzebujesz.
Teh JoE
Nigdy o tym nie słyszałem. „Security-Enhanced Linux (SELinux) to moduł bezpieczeństwa jądra systemu Linux, który zapewnia mechanizm obsługi zasad bezpieczeństwa kontroli dostępu”. Wątpię, żeby to wyłączyć. I założę się, że zwolennicy ślepo używają tego polecenia, nie rozumiejąc pełnych konsekwencji.
Ryan
18

Problem rozwiązany

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

umożliwia to uprawnienie do zapisu w aplikacji, strukturze i dziennikach Mam nadzieję, że to pomoże

user3470929
źródło
12
nigdy w 777 ... dev lub prod jak to daje złudzenie rzeczy pracujących w dev ale będą one przełamać w prod chyba 777, a także, które nigdy nie jest dobrym pomysłem
Kyle Burkett
wooha you rock ... vendor był tym, którego mi brakowało
lu1s
tak, dawanie czegokolwiek w publicznej sieci 777 to zły pomysł
imabug
17

NIGDY NIE UDZIELAJ GO ZEZWOLENIA 777!

przejdź do katalogu projektu laravel na swoim terminalu i napisz:

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

W ten sposób nadajesz swojemu użytkownikowi uprawnienia właściciela i dajesz mu uprawnienia:
1 wykonanie, 2 zapis, 4 odczyt
1 + 2 + 4 = 7 środków (rwx)
2 + 4 = 6 środków (rw) w
końcu, dla dostępu do pamięci, ug + rwx oznacza, że ​​dajesz użytkownikowi i grupie 7

Ibrahim W.
źródło
1
Nie wiem, dlaczego wielu programistów lubi używać 777 ... w jakiś sposób nie dbali o swój system ..
ZeroOne
15

Dla włóczęgów rozwiązaniem jest:

(vagrant) pamięć podręczna php artisan: wyczyść

(poza vagrantem) chmod -R 777 app / storage

(w włóczęgach) kompozytor dump-autoload

Upewnij się, że poruszasz się w swoim lokalnym środowisku, a nie wewnątrz włóczęgi, jest tutaj ważne!

Brendan
źródło
6
czy 777 nie jest zbyt otwarte?
simo
3
To znaczy do produkcji, jasne. Ale to jest lokalne środowisko programistyczne. 777 był tym, czego używał oryginalny plakat, a inne odpowiedzi. 775 lub 755 może działać w zależności od.
Brendan,
12

Spróbuj ponownie z chmod -R 755 /var/www/html/test/app/storage. Używaj z sudo Operation not permittedw chmod. Użyj uprawnień Sprawdź właściciela, jeśli nadal występuje błąd.

Khay
źródło
Nie działa. Wszystkie katalogi w aplikacji mają uprawnienia drwxrwxrwx
vishnub1626
@tav czy możesz sprawdzić uprawnienia właściciela do folderu testowego?
Khay
To samo drwxrwxrwx. Rozwiązano problem, korzystając z sugestii @ vsmoraes (patrz komentarze)
vishnub1626
4
chmod 777 to zagrożenie bezpieczeństwa
Yogesh Kamat
9

Zgodnie z Laravel 5.4, który jest najnowszy w chwili, gdy to piszę, jeśli masz taki problem, musisz zmienić uprawnienia. NIE SŁUCHAJ NIKOGO, KTÓRZY POWIEDZIE, ABY USTAWIĆ 777 DLA ŻADNEGO KATALOGU. Ma problem z bezpieczeństwem. Zmień uprawnienia do folderu przechowywania w ten sposób

sudo chmod -R 775 storage

Zmień uprawnienia do folderu bootstrap w ten sposób

sudo chmod -R 775 bootstrap/cache

Teraz upewnij się, że wykonujesz oba polecenia z katalogu aplikacji. W przyszłości nie będziesz mieć problemów z pozwoleniem. 775 nie zagraża bezpieczeństwu Twojej maszyny.

Koushik Das
źródło
7

Zaproponuj poprawne pozwolenie, jeśli dla Apache,

sudo chown -R apache:apache apppath/app/storage
Sean
źródło
Laravel Forge use: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy
6

Jeśli masz Laravel 5 i szukasz stałego rozwiązania, odpowiednie zarówno php artisanużycie wiersza poleceń, jak i serwer Apache, użyj tego:

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

Zobacz szczegółowe wyjaśnienie tutaj .

alexeydemin
źródło
8
wydaje się złym pomysłem użycie 777
Randy L,
umask 000 w resolv.conf?! skąd ci ludzie biorą te informacje? to jest niepoprawna linia w resolv.conf. Proszę zignoruj ​​to i wszystkie 777 „rozwiązań” tam
higuita
sprawdź adres URL i nie znajdź opcji umask w resolv.conf linux.die.net/man/5/resolv.conf
higuita
6

DLA KAŻDEGO URUCHAMIAJĄCEGO SYSTEM OPERACYJNY Z SELINUX: Prawidłowy sposób zezwolenia httpd na zapis w folderze magazynu laravel to:

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

Następnie, aby natychmiast zastosować zmiany:

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

SELinux może być trudny do pokonania, ale jeśli jest obecny, MOCNIE RADZĘ, abyś się go nauczył, zamiast całkowicie go ominąć.

Heather Gaye
źródło
mój dokładny problem w świeżym centos 7 był podobny. mówiło o braku pozwolenia na pisanie, ale wszyscy mieli 777 do przetestowania. Więc ten post rzeczywiście zaoszczędził mi czasu po ogólnej kontroli.
HumaN
1
To jest poprawne rozwiązanie, chociaż myślę, że poprawny typ SELinuksa powinien być httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug
4

Miałem ten sam problem, a poniższe kroki pomogły mi go rozwiązać.

  1. Dowiedz się, kto jest użytkownikiem Apache - utworzył plik test.php w folderze publicznym z kodem

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

I uruchom plik z przeglądarki internetowej. Dałoby to użytkownikowi apache. W moim przypadku jest to ec2-user, ponieważ używałem aws z cronjob zainstalowanym w /etc/cron.d/. Dla innych może to być inny użytkownik.

  1. Uruchom poniższe polecenie w wierszu poleceń.

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

Musisz tutaj zidentyfikować i użyć odpowiednich „użytkowników” i „grup użytkowników”.

KiranD
źródło
4

Jeśli korzystasz z Linuksa lub Maca, nawet możesz uruchomić ssh terminal. Możesz użyć terminala do uruchomienia tego polecenia,

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

Jeśli korzystasz z systemu Windows, możesz uruchomić za pomocą git bash.

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

Możesz pobrać formularz git https://git-scm.com/downloads .

Rasheduzzaman
źródło
3

Xampp do użytku:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
cristianojeda
źródło
1
czy możesz to trochę wyjaśnić?
Aaron Hall
Korzystam z tego artykułu i byłem: Konfigurowanie Laravel 4.x na Mac OSX 10.8+ z XAMPP
cristianojeda
3
chmod 777 jest zagrożeniem dla bezpieczeństwa
Yogesh Kamat
1
Możesz również użyć tego chmod 775
cristianojeda
2

Za każdym razem, gdy zmieniam app.php, otrzymuję odmowę pozwolenia na zapisanie bootstrap / cache / services.json, więc zrobiłem to, aby to naprawić:

chmod -R 777 bootstrap/cache/
malhal
źródło
8
chmod 777 jest zagrożeniem dla bezpieczeństwa
Yogesh Kamat
2
rm storage/logs/laravel.log  

rozwiązał to dla mnie

aad1992
źródło
2

Ustawienie pozwolenia na 777 to zdecydowanie okropny pomysł!

... ale

Jeśli otrzymujesz błąd uprawnień związany z folderem „przechowywanie”, to zadziałało:

1) Ustaw „przechowywanie” i jego uprawnienia do podfolderów na 777 z

sudo chmod -R 777 storage/

2) W przeglądarce przejdź do strony głównej laravel laravel / public / (laravel utworzy niezbędne początkowe pliki pamięci)

3) Zwróć bezpieczne pozwolenie 775 do magazynu i jego podfolderów

sudo chmod -R 775 storage/
Nika Tsogiaidze
źródło
2

Jeśli używasz laradock, spróbuj chown -R laradock:www-data ./storagew kontenerze obszaru roboczego

Rob L
źródło
1

W moim przypadku rozwiązaniem była zmiana uprawnień do katalogów app/storage/framework/viewsi app/storage/logs.

Legowisko
źródło
0

Jeśli ktoś inny napotka podobny problem z błędem uprawnień do plików fopen, ale jest wystarczająco mądry, aby nie ślepo chmod 777, oto moja sugestia.

Sprawdź polecenie, którego używasz, aby uzyskać uprawnienia, których potrzebuje apache:

fopen('filepath/filename.pdf', 'r');

Litera „r” oznacza, że ​​jest otwarta tylko do odczytu, a jeśli nie edytujesz pliku, powinieneś ustawić go jako. Oznacza to, że apache / www-data potrzebuje przynajmniej uprawnień do odczytu tego pliku, które jeśli plik zostanie utworzony przez laravel, będzie miał już uprawnienia do odczytu.

Jeśli z jakiegoś powodu musisz napisać do pliku:

fopen('filepath/filename.pdf', 'r+');

Następnie upewnij się, że apache również ma uprawnienia do zapisu w pliku.

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

Kyle Burkett
źródło
0

Po prostu uruchom serwer za pomocą artisian

php artisian serve

Następnie uzyskaj dostęp do swojego projektu z określonego adresu URL:

wprowadź opis obrazu tutaj

wajih
źródło
0

Mam ten sam problem podczas uruchamiania Vagrant na Macu. rozwiązano problem poprzez zmianę użytkownika serwera Apache w pliku https.conf:

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

Uruchom apache jako użytkownika php zamiast demona użytkownika, aby rozwiązać problem z dostępem do plików w 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

teraz plik pamięci podręcznej utworzony przez php może być odczytywany i edytowany przez apache bez pokazywania błędu uprawnień dostępu.

nigam214
źródło
0

Po wielu próbach i błędach z uprawnieniami do katalogu skończyło się objawieniem ... na partycji dysku zabrakło miejsca. Chciałem się tylko podzielić, aby upewnić się, że nikt inny nie jest na tyle głupi, by szukać rozwiązania w złym kierunku.

W Linuksie możesz użyć df -hdo sprawdzenia rozmiaru dysku i wolnego miejsca.

Szczery
źródło
0

Ten problem jest faktycznie spowodowany przez różnych użytkowników, którzy chcą write/read złożyć wniosek, ale odmówiono mu dostępu różnych praw własności. może jako „root” zainstalowałeś laravela, zanim zalogujesz się do swojej witryny jako użytkownik „laravel”, gdzie „laravel” jest domyślnym właścicielem, więc to jest prawdziwy problem. Więc kiedy użytkownik „laravel” chce domyślnie odczytywać / zapisywać wszystkie pliki na dysku, należy odmówić mu prawa własności do tego pliku przez „root”.

Aby rozwiązać ten problem, możesz wykonać następujące czynności:

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

lub w moim przypadku

sudo chown -hR igmcoid /root /sublaravel

Notatka:

  1. root jako pierwszy właściciel, który zainstalował wcześniej
  2. your-user-name jako domyślny właściciel, który faktycznie pisze / czyta w witrynie.
  3. namefolder jako folder nazw, dla których chcesz zmienić własność.
Bliss Jaspis
źródło
0

Mam te same błędy w moim projekcie ...
Ale okazało się, że zapomniałem wypełnić enctypeformularz.

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

Mam nadzieję, że gdzieś to pomoże ...

Vpa
źródło
0

Podczas pracy na Windows 10 z Laragonem i Laravelem 4 wydawało mi się, że nie ma możliwości ręcznej zmiany uprawnień, ponieważ wykonywanie chmod-poleceń w terminalu wbudowanym w Laragon nie przyniosło żadnego efektu.

Jednak w tym terminalu można było przejść do folderu przechowywania i ręcznie dodać żądane foldery, takie jak ten:

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

Polecenie cd-w terminalu przenosi Cię do folderu (może być konieczne dostosowanie tej ścieżki do struktury plików). mkdir-Polecenie stworzy katalog o podanej nazwie.

Nie miałem okazji przetestować tego podejścia w Laravel 5, ale oczekuję, że podobne podejście powinno zadziałać.

Oczywiście może być lepszy sposób, ale przynajmniej było to rozsądne obejście mojej sytuacji (naprawienie błędu:) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.

Virginia
źródło
-1
  1. Najpierw usuń folder przechowywania, a następnie ponownie utwórz folder przechowywania.
  2. Wewnątrz folderu przechowywania utwórz nową nazwę folderu jako strukturę.
  3. Wewnątrz folderu framework stwórz trzy nazwy folderów jako pamięć podręczną, sesje i widoki.

W ten sposób rozwiązałem swój problem.

Md Juyel Rana
źródło
-4

Próbowałem dać 777dostęp do folderu przechowywania i działa dla mnie

1) przejdź do katalogu głównego laravel ( /var/www/htmldla mnie) i uruchom następujące polecenie

chmod 777 -R storage
Yur Gasparyan
źródło
2
Nie ustawiaj uprawnień na 777, ponieważ sprawia to, że katalog jest widoczny i edytowalny dla każdego, kto może go zobaczyć. Nie jest to zalecane!
CodeNinja,