file_put_contents (meta / services.json): akış açılamadı: İzin reddedildi


169

Laravel'de yeniyim. Açmaya çalışıyordum http://localhost/test/public/ve

İstisna işleyicisinde hata.

Etrafta dolaştım ve depolama dizininin iznini chmod -R 777 app/storageancak boşuna kullanarak değiştirdim .

Değiştim debug=>trueiçinde app.phpve sayfayı ziyaret ederek durum işleyici Hata var:

"/Var/www/html/test/app/storage/logs/laravel.log" akışı veya dosyası açılamadı: akış açılamadı: / var / www / html / test / bootstrap / compiled'de izin reddedildi. php: 8423

Sonra komutu kullanarak depolama dizininin izinlerini değiştirdim chmod -R 644 app/storageve 'Özel durum işleyicisinde hata' hatası gitti ve bir sayfa yüklendi. Ama orada bunu alıyorum:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): akış açılamadı: İzin reddedildi


2
yine izin sorunu gibi görünüyor, chmod tüm uygulama dizinleri özyinelemeli
alou

@alou Ben chmod -R 777 uygulama / depolama ile zaten yaptım düşünüyorum. Öyle değil mi? Ve uygulama içindeki tüm dizinler drwxrwxrwx iznine sahiptir.
vishnub1626

33
Deneyin: php artisan cache:clearo zaman chmod -R 777 app/storagesonundaphp artisan dump-autoload
vsmoraes

@vsmoraes Çalıştı. Sorunun ne olduğunu açıklamak gerçekten yararlı olacaktır.
vishnub1626

7
vsmoraes adlı kullanıcının yorumu doğruydu ancak 'php artisan dump-autoload' yerine 'besteci dump-autoload' olmalı
Elliot Robert

Yanıtlar:


320

Vsmoraes'dan öneri benim için çalıştı:

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

NOT: BUNU UZAKTAN SUNUCU YAPMAYIN (DEV VEYA ÜRETİM)

Bu soruyu sorduğumda, bu sanal makinede çalışan localhost'umda bir problemdi. Bu yüzden 777 kurmanın yeterince güvenli olduğunu düşündüm, ancak farklı bir çözüm aramanız gerektiğini söyleyen insanlar haklı. Önce 775'i deneyin


8
Bu sudo chmod -R 777 uygulama / depolama alanı olmalıdır. izin hatası önlemek için.
Olaitan Mayowa

5
# Laravel5 için talimatlar hemen hemen aynıdır:, php artisan cache:clearsonra chmod -R 777 storageve sonra composer dump-autoload
WNRosenberg

6
Laravel 5.1+ kullanıyorsanız chmod -R 777 storagebunun yerine yapmanız gerekecek
James

10
php artisan cache:cleardoğru cevaptır. Daha sonra okuma / yazma veya özellikle yürütme ayrıcalıkları vermedensudo chmod -R ug+rw storage benim için doğru izinleri verir . others
Zack Morris

43
Bu cevap ve konu, Laravel'i neden bu kadar sevmediğimi vurgulamaktadır: geliştiricilere, sonuçları düşünmeden istediğiniz her şeyi istediğiniz zaman, istediğiniz kadar hızlı yapabileceğinizi öğretir ( 777Laravel'e özgü olmadığını anlıyorum, ancak Laravel geliştiricileri için düşünce süreci şöyledir: "ŞİMDİ çalışmasını sağlayın, nasıl umurumda değil" 777. Genel bir kural olarak, hiçbir zaman 777işe yarayacak bir şey ayarlamayın . Sunucunuzu ve kullanıcılarınızı / rollerinizi ANLAYIN ve uygun şekilde ayarlayın; bunu hackleme. Müşterileriniz bunu doğru yapmanız için size güveniyor.
dKen

70

Laravel 5 ile bu sorunu yaşayan Google çalışanları için.

Bu, farklı kullanıcıların sitedeki aynı günlük dosyasına yazmaya çalışmasının neden olduğu bir izin sorunudur storage/logs klasör izin farklı izinlerle .

Olan şey, laravel yapılandırmanızın günlük hataları günlüğe kaydedecek şekilde ayarlanmış olmasıdır ve bu nedenle web sunucunuz (apache / nginx), ortamınıza bağlı _wwwolarak OSX veya www-data* NIX sistemlerinde olduğu gibi bir şey olabilir. bazı esnaf komutlarını çalıştırıp bazı hatalar aldığınız zaman gelir, bu yüzden esnaf bu dosyayı yazacaktır, ancak farklı bir kullanıcı ile terminaldeki PHP farklı bir kullanıcı tarafından gerçekte giriş kullanıcısı tarafından yürütüldüğünden, bu komutu çalıştırarak kontrol edebilirsiniz. :

php -i | grep USER

Giriş kullanıcısı web sunucunuzda bu günlük dosyasını oluşturduysa, laravel günlük dosyalarını yazdığı için hata yazamazsınız. 655 varsayılan olarak yalnızca sahibin içine yazmasına izin veren .

Bu geçici durumu düzeltmek için, 664hem oturum açma kullanıcınızın hem de web sunucusu kullanıcınızın bu günlük dosyasına yazabilmesi için bu dosyaya grup için el ile izinler vermeniz gerekir .

Bu sorunu kalıcı olarak önlemek storage/logsiçin dizinde izinleri devralarak dizin içinde yeni bir dosya oluşturulduğunda uygun bir izin ayarlamak isteyebilirsiniz. Bu yanıt https://unix.stackexchange.com/a/115632 ile başa çıkmanıza yardımcı olabilir söyledi.


fan-friggen-tastic cevap burada! Elastik Beanstalk üzerinde çalışıyorum ve benim komut satırı PHP kullanıcı "ec2 kullanıcı" ama benim uygulama "webapp" olarak çalışır.
Randy L

1
Sorunu açıklayan bir cevap. yani uygun bir cevap.
Craicerjack

Bu, Cloudways'de Laravel'de neden bir dosya önbellek hatası aldığımı anlamama yardımcı oldu. Dosya izinlerini sıfırlamak için Cloudways panelindeki düğmeye basmam gerekiyordu. Teşekkürler.
Ryan

44

777 izin vermemelisiniz. Bu bir güvenlik riski. Ubuntu kullanıcıları için Laravel 5'te dizin depolama sahibini tekrar tekrar değiştirmeyi öneriyorum:

Aşağıdakileri deneyin:

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

Ubuntu tabanlı sistemlerde, www-data apache kullanıcısıdır.


2
Bu benim için düzeltildi ve chmod 777cevaplardan daha doğru (sanırım) . Teşekkürler ~
GavinR

Bence Linux kullanıcıları için en uygun cevap bu. Teşekkürler @GavinR. chmod 777tam bir kabus.
Abdalla Arbab

Bu benim için çalıştı ve kesinlikle chmod -777
Egnaro

Sorunu çözmenin yeni bir yolu için teşekkür ederiz! chmod 777Sonuçları tersine çevirmek için Komutunuzdan önce / sonra bir şeyler yapmamız gerekiyor mu?
Aleksandar

41

Laravel 5, Homestead ve Mac kullanan herkes için şunu deneyin:

mkdir storage/framework/views

Bu ayrıca Laravel 5.2.7 ile Laravel Forge ile yeni bir sunucu yapmakla da çalışır
winkster

2
Bu benim için yaptı. Görünüşe göre bootstrap/cache/compiled.phpbu dizine yazmaya çalışıyor, ancak yoktu ve bir izin hatası attı. Teşekkür ederim.
Matt K

1
Bir şekilde bu benim için çalıştı. Laravel 5.1 btw kullanıyorum
Yohanes Gultom

Bu benim için yaptı, teşekkürler. Bu laravel tarafından tekrar üretileceğini düşünerek tüm depolama dizinimi kaldırmıştım, sanırım hayır.
grimmdude

33

bazen SELINUX bu soruna neden oldu; selinux'u bu komutla devre dışı bırakabilirsiniz.

sudo setenforce 0

vay, gerçekten hile yaptım ve çalışıyor, biri bana neden işe yaradığını açıklayabilir mi? selinux nedir?
undefinedman

evet bu gerçekten işe yaradı! lütfen bunu SELINUX'ta anlamamıza yardım edin? im fedora 24 btw kullanarak
loki9

1
Teşekkür ederim, çok teşekkür ederim. İnternette arama yapıyorum ve herkes bana izni kontrol et, kullanıcıyı kontrol et ve benzeri
şeyler söylüyor

3
Bu, temel olarak tüm güvenlik duvarını kapatmak gibidir, çünkü açmanız gereken bir bağlantı noktasını engeller.
Teh JoE

Bunu hiç duymamıştım. "Güvenliği Geliştirilmiş Linux (SELinux), erişim kontrolü güvenlik politikalarını desteklemek için bir mekanizma sağlayan bir Linux çekirdek güvenlik modülüdür." Kapatmak iyi bir fikirdir. Ve bahse girerim, yükselenler bu sonuçları tam olarak anlamadan körü körüne kullanıyorlar.
Ryan

18

Sorun çözüldü

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

Bu uygulama, çerçeve, günlükleri yazma izni sağlar Bu yardımcı olacağını umuyoruz


12
asla 777 ... geliştirici ya da eşya geliştirici şeyler yanılsama verecek gibi ama 777 sürece de eşya kırmak asla iyi bir fikir değildir
Kyle Burkett

wooha you rock ... satıcı eksik olduğum biriydi
lu1s

evet, halka açık bir web 777 üzerinde bir şey vermek kötü bir fikir
imabug

17

ASLA İZİN VERME 777!

terminalinizdeki laravel projesinin dizinine gidin ve şunu yazın:

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

Bu şekilde, kullanıcı sahibi olursunuz ve ayrıcalıklar verirsiniz:
1 Yürütme, 2 Yazma, 4 Okuma
1 + 2 + 4 = 7, (rwx)
2 + 4 = 6,
nihayet, depolama erişimi için, ug + rwx, kullanıcıya ve gruba 7 verdiğiniz anlamına gelir


1
i neden dev 777 kullanmak gibi bir sürü bilmiyorum ... bir şekilde onlar kendi sistemi hakkında umursamadı ..
ZeroOne

15

Vagrant kullanıcıları için çözüm:

(vagrant olarak) php esnaf önbellek: temizle

(vagrant dışında) chmod -R 777 uygulama / depolama

(vagrant olarak) besteci dökümü otomatik yüklemesi

Burada vagrant içinde değil, yerel ortamda chmod emin olmak önemlidir!


6
777 çok açık değil mi?
simo

3
Yani üretim için elbette. Ancak bu yerel bir geliştirme ortamıdır. Orijinal posterin kullandığı 777 idi ve diğer cevaplar.775 veya 755 bağlı olarak çalışabilir.
Brendan

12

İle tekrar deneyin chmod -R 755 /var/www/html/test/app/storage. Operation not permittedChmod için sudo ile kullanın . Hala hatayla karşılaşıyorsanız Sahip sahibini denetle seçeneğini kullanın.


Çalışmıyor. Uygulama içindeki tüm dizinlerin izni var drwxrwxrwx
vishnub1626

@tav lütfen test klasörünüz için sahip izninizi kontrol edebilir misiniz?
Khay

Aynı drwxrwxrwx. @ Vsmoraes önerilerini kullanarak sorunu çözdü (yorumlara bakın)
vishnub1626

4
chmod 777 bir güvenlik riskidir
Yogesh Kamat

9

Bunu yazdığım en son Laravel 5.4'e göre, böyle bir sorununuz varsa, izni değiştirmeyi düşündünüz. HERHANGİ BİR REHBERLİK İÇİN 777'Yİ AYARLAMANIZI SÖYLEYEN BİRİ DİNLEME. Bir güvenlik sorunu var. Depolama klasörünün iznini bu şekilde değiştirin

sudo chmod -R 775 storage

Bootstrap klasörü iznini bu şekilde değiştir

sudo chmod -R 775 bootstrap/cache

Şimdi her iki komutu da uygulama dizininizden yürüttüğünüzden emin olun. İleride izin konusunda sorun yaşamayacaksınız. 775, makinenizin güvenliğinden ödün vermez.


7

Apache için doğru izni önerin,

sudo chown -R apache:apache apppath/app/storage

Laravel Forge kullanımı: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy

6

Eğer varsa laravel 5 ve seyir kalıcı bir çözüm, yürürlükteki hem php artisankomut satırı kullanımını ve Apache sunucu kullanımını bu:

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

Ayrıntılı açıklamaya buradan bakın .


8
777 kullanmak için kötü bir fikir gibi görünüyor
Randy L

umask 000 içinde resolv.conf ?! bu insanlar bu bilgiyi nereden alıyor? resolv.conf dosyasında geçersiz bir satır var. Lütfen bunu ve tüm 777 "çözümleri" görmezden
gelin

url'yi kontrol edin ve resolv.conf'da hiç umask seçeneği bulun linux.die.net/man/5/resolv.conf
higuita

6

SELINUX İLE BİR İSİ ÇALIŞAN HERKES İÇİN: httpd'nin laravel depolama klasörüne yazmasına izin vermenin doğru yolu:

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

Ardından değişiklikleri hemen uygulamak için:

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

SELinux, başa çıkmak için bir acı olabilir, ancak mevcutsa, tamamen atlamak yerine onu öğrenmenizi şiddetle tavsiye ederim.


taze centos 7 benim kesin sorun benzerdi. yazma izni yok ama test için hepsi 777 idi. Bu yazı aslında tüm genel kontrollerden sonra zamanımı kurtardı.
HumaN

1
Doğru SELinux tipi httpd_sys_rw_content_tsudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

Aynı sorunu yaşadım ve aşağıdaki adımlar sorunu çözmeme yardımcı oldu.

  1. Apache kullanıcısını bulun - ortak klasörde kodu içeren bir test.php dosyası oluşturun

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

Ve dosyayı web tarayıcısından çalıştırın. Apache kullanıcısına verecekti. Benim durumumda, /etc/cron.d/ içinde yüklü cronjob ile aws kullanırken ec2 kullanıcısı. Başkaları için farklı bir kullanıcı olabilir.

  1. Komut satırında aşağıdaki komutu çalıştırın.

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

Burada doğru "kullanıcı" ve "kullanıcı grubunu" tanımlamanız ve kullanmanız gerekir.


4

Linux veya Mac kullanıyorsanız bile çalışabilirsiniz ssh terminal. Bu komutu çalıştırmak için terminal kullanabilirsiniz,

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

Windows kullanıyorsanız, kullanarak çalıştırabilirsiniz git bash.

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

Git formunu https://git-scm.com/downloads adresinden indirebilirsiniz .



2

Ben app.php değiştirmek her zaman bootstrap / cache / services.json yazma reddedildi bu yüzden bunu düzeltmek için yaptım:

chmod -R 777 bootstrap/cache/

8
chmod 777 bir güvenlik riskidir
Yogesh Kamat

2
rm storage/logs/laravel.log  

bunu benim için çözdü


2

777'ye izin vermek kesinlikle korkunç bir fikir!

... fakat

Benim için işe yarayan "depolama" klasörüne bağlı izin hatası alıyorsanız:

1) "depolama" ve alt klasör iznini 777 olarak ayarlayın.

sudo chmod -R 777 storage/

2) Tarayıcıda laravel ana sayfasına gidin laravel / public / (laravel gerekli başlangıç ​​depolama dosyalarını oluşturur)

3) Depolama ve alt klasörlerine güvenli 775 izni iade edin

sudo chmod -R 775 storage/

2

Laradock kullanıyorsanız, chown -R laradock:www-data ./storageçalışma alanı kabınızda deneyin


1

Benim durumumda çözüm izinleri app/storage/framework/viewsve app/storage/logsdizinleri değiştirmek oldu .


0

Başka kimse fopen dosya izinleri hatası ile benzer bir sorunla karşılaşırsa, ancak körü körüne chmod 777 için yeterince akıllıca burada benim önerim.

Apache'nin ihtiyaç duyduğu izinler için kullandığınız komutu kontrol edin:

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

'R' salt okunur olarak açık demektir ve dosyayı düzenlemiyorsanız, bu şekilde ayarlamanız gerekir. Bu, apache / www-data dosyasının bu dosya üzerinde en azından okuma iznine ihtiyacı olduğu anlamına gelir; dosya laravel yoluyla oluşturulursa zaten okuma iznine sahip olacaktır.

Herhangi bir nedenle dosyaya yazmanız gerekiyorsa:

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

Ardından, apache'nin dosyaya yazma izinlerine sahip olduğundan emin olun.

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


0

Sunucunuzu kullanarak artisian

php artisian serve

Ardından projenize belirtilen URL'den erişin:

resim açıklamasını buraya girin


0

Mac'te vagrant çalıştırırken de aynı sorun var. https.conf dosyasındaki Apache sunucusu kullanıcısını değiştirerek sorunu çözdü:

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

Php ile dosya erişim sorununu çözmek için kullanıcı daemon yerine php kullanıcı altında apache çalıştırın

# 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

şimdi, php oluşturulan önbellek dosyası herhangi bir erişim izni hatası göstermeden apache tarafından okunabilir ve düzenlenebilir.


0

Dizin izinleriyle ilgili bir çok deneme yanılma işleminden sonra bir epifani ile karşılaştım ... diskin bölümünde boşluk kalmamıştı. Sadece kimsenin çözümü yanlış yönde aramaya devam edecek kadar aptal olmadığından emin olmak için paylaşmak istedim.

Linux'ta df -hdisk boyutunuzu ve boş alanınızı kontrol etmek için kullanabilirsiniz .


0

Bu sorun aslında farklı kullanıcılar tarafından write/read dosyalamak ancak farklı sahipliğe neden olmayan farklı . belki daha önce 'root' yüklü laravel olarak sitenize 'laravel' kullanıcısı olarak giriş yaparsınız. Dolayısıyla 'laravel' kullanıcısı diskteki tüm dosyaları varsayılan olarak okumak / yazmak istediğinde, reddedilecekse, o dosyanın 'root' tarafından sahiplenilmesine neden olur.

Bu sorunu çözmek için şu şekilde takip edebilirsiniz:

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

veya benim durumumda

sudo chown -hR igmcoid /root /sublaravel

Dipnot:

  1. root daha önce kurulmuş ilk sahiplik adı olarak
  2. your-user-name sitede gerçekten yazan / okuyan varsayılan sahiplik olarak.
  3. namefolder sahipliğini değiştirmek istediğiniz ad klasörü olarak.

0

Projemde aynı hatalar var ...
Ama formuma koymayı unuttuğumu öğrendim enctype.

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

Umarım bir şekilde bir yere yardımcı olur ...


0

Laragon ve Laravel 4 ile Windows 10 üzerinde çalışırken, bana izinleri manuel olarak değiştirmenin bir yolu yoktu, çünkü chmodLaragon yerleşik terminalinde -komutları çalıştırmanın bir etkisi yoktu.

Ancak, bu terminalde depolama klasörüne gidip aşağıdaki gibi istenen klasörleri manuel olarak eklemek mümkün oldu:

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

cdTerminalde -command (eğer dosya yapısı uyacak şekilde bu yolu ayarlamanız gerekebilir) klasörüne getirir. mkdir-Command verilen adla dizin oluşturacaktır.

Laravel 5'te bu yaklaşımı test etme fırsatım olmadı, ancak benzer bir yaklaşımın işe yarayacağını umuyorum.

Tabii ki daha iyi bir yol olabilir, ama en azından bu durumum için makul bir çözümdü (hatayı düzeltmek:) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.


-1
  1. Önce, depolama klasörünü silin ve tekrar depolama klasörünü oluşturun.
  2. Depolama klasörünün içinde çerçeve olarak yeni bir klasör adı oluşturun.
  3. Çerçeve klasörünün içinde önbellek, oturumlar ve görünümler olarak üç klasör adı oluşturun.

Bunu yaparak sorunumu çözdüm.


-4

777Depolama klasörüne erişim sağlamaya çalıştım ve benim için iş var

1) laravel kök dizininize gidin ( /var/www/htmlbenim için) ve aşağıdaki komutu çalıştırın

chmod 777 -R storage

2
777 olarak izinler ayarlamayın, bu dir dir görebiliyor herkes için görünür ve düzenlenebilir yapar. Bu önerilmez!
CodeNinja
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.