file_put_contents (meta / services.json): gagal membuka aliran: Izin ditolak

169

Saya baru mengenal Laravel. Saya mencoba untuk membuka http://localhost/test/public/dan mendapatkan

Kesalahan dalam handler pengecualian.

Saya googled sekitar dan mengubah izin direktori penyimpanan menggunakan chmod -R 777 app/storagetetapi tidak berhasil.

Aku berubah debug=>truedi app.phpdan mengunjungi halaman dan mendapat Kesalahan dalam pengecualian handler:

Aliran atau file "/var/www/html/test/app/storage/logs/laravel.log" tidak dapat dibuka: gagal membuka streaming: Izin ditolak di / var / www / html / test / bootstrap / dikompilasi. php: 8423

Kemudian saya mengubah izin direktori penyimpanan menggunakan perintah chmod -R 644 app/storagedan kesalahan 'Kesalahan dalam penanganan handler' hilang dan halaman dimuat. Tetapi di sana saya mendapatkan ini:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): gagal membuka streaming: Izin ditolak

vishnub1626
sumber
2
tampak seperti masalah permition lagi, chmod rekursif semua direktori aplikasi
Alou
@ alou Saya pikir saya sudah melakukannya dengan chmod -R 777 aplikasi / penyimpanan. Bukan begitu? Dan semua direktori di dalam aplikasi memiliki izin drwxrwxrwx.
vishnub1626
33
Coba: php artisan cache:clearkemudian chmod -R 777 app/storageakhirnyaphp artisan dump-autoload
vsmoraes
@ vsmora Itu berhasil. Akan sangat membantu jika Anda bisa menjelaskan apa masalahnya.
vishnub1626
7
Komentar vsmoraes benar tetapi alih-alih 'php artisan dump-autoload' di harus 'komposer dump-autoload'
Elliot Robert

Jawaban:

320

Saran dari vsmora berhasil bagi saya:

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

CATATAN: JANGAN MELAKUKANNYA PADA SERVER REMOTE INI (DEV ATAU PRODUKSI)

Ketika saya mengajukan pertanyaan ini, ini merupakan masalah di localhost saya, berjalan di Mesin Virtual. Jadi saya pikir pengaturan 777 cukup aman, namun, orang benar ketika mereka mengatakan Anda harus mencari solusi yang berbeda. Coba 775 dulu

ecairol
sumber
8
Ini seharusnya sudo chmod -R 777 aplikasi / penyimpanan. untuk menghindari kesalahan izin.
Olaitan Mayowa
5
Untuk # Laravel5 instruksinya hampir sama:, php artisan cache:clearlalu chmod -R 777 storage, dan kemudian composer dump-autoload
WNRosenberg
6
Jika Anda menggunakan LARAVEL 5.1+ Anda harus melakukan chmod -R 777 storagesebaliknya
James
10
php artisan cache:clearadalah jawaban yang benar. Kemudian sudo chmod -R ug+rw storageberikan izin yang benar untuk saya, tanpa memberi othersbaca / tulis atau terutama menjalankan hak istimewa.
Zack Morris
43
Jawaban dan utas ini adalah yang menyoroti mengapa saya sangat tidak menyukai Laravel: ini mengajarkan pengembang bahwa Anda dapat melakukan apa pun yang Anda inginkan, kapan pun Anda mau, secepat yang Anda inginkan, tanpa memikirkan konsekuensinya (saya mengerti 777bukan khusus Laravel, tetapi proses berpikir untuk pengembang Laravel adalah: "membuatnya bekerja SEKARANG, saya tidak peduli bagaimana", sama seperti 777). Sebagai aturan umum, tidak pernah, menetapkan apa pun 777untuk mendapatkan sesuatu untuk bekerja. PAHAMI server dan pengguna / peran Anda dan atur sesuai; jangan diretas. Klien Anda memercayai Anda untuk melakukan ini dengan benar.
dKen
70

Untuk googler yang telah menghadapi masalah ini dengan Laravel 5.

Ini adalah masalah izin yang disebabkan oleh pengguna yang berbeda yang mencoba menulis pada file log yang sama dalam storage/logsfolder dengan izin yang berbeda.

Apa yang terjadi adalah konfigurasi laravel Anda mungkin adalah pengaturan untuk mencatat kesalahan setiap hari dan oleh karena itu server web Anda (apache / nginx) dapat membuat file ini di bawah pengguna default tergantung pada lingkungan Anda, dapat berupa sesuatu seperti _wwwpada OSX atau www-datapada sistem * NIX, maka masalahnya datang ketika Anda mungkin telah menjalankan beberapa perintah artisan dan mendapat beberapa kesalahan, sehingga artisan akan menulis file ini tetapi dengan pengguna yang berbeda karena PHP pada terminal dijalankan oleh pengguna yang berbeda sebenarnya pengguna login Anda, Anda dapat memeriksanya dengan menjalankan perintah ini :

php -i | grep USER

Jika pengguna login Anda membuat file log server web Anda, Anda tidak akan dapat menulis kesalahan di dalamnya dan sebaliknya karena laravel menulis file log dengan 655izin secara default yang hanya memungkinkan pemilik untuk menulis di dalamnya.

Untuk memperbaiki ini sementara Anda harus secara manual memberikan izin untuk grup 664ke file ini sehingga pengguna login dan pengguna server web Anda dapat menulis ke file log itu.

Untuk menghindari masalah ini secara permanen, Anda mungkin ingin mengatur izin yang tepat ketika file baru dibuat dalam storage/logsdirektori dengan mewarisi izin dari direktori ini. Jawaban ini https://unix.stackexchange.com/a/115632 dapat membantu Anda menangani bahwa.

Adriano Rosa
sumber
fan-friggen-tastic jawab di sini! Saya menjalankan Elastic Beanstalk dan pengguna PHP baris perintah saya adalah "ec2-user" tetapi aplikasi saya berjalan sebagai "webapp".
Randy L
1
Jawaban yang menjelaskan masalahnya. yaitu jawaban yang tepat.
Craicerjack
Ini membantu saya menyadari mengapa saya mendapatkan kesalahan cache file di Laravel on Cloudways. Saya perlu menekan tombol di panel Cloudways untuk mengatur ulang izin file. Terima kasih.
Ryan
44

Anda seharusnya tidak memberikan 777 izin. Ini risiko keamanan. Untuk pengguna Ubuntu, di Laravel 5, saya menyarankan untuk mengganti pemilik untuk penyimpanan direktori secara rekursif:

Coba ikuti:

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

Dalam sistem berbasis Ubuntu, www-data adalah pengguna apache.

RibeiroSt
sumber
2
Ini tetap untuk saya, dan lebih tepat (saya pikir) daripada chmod 777jawabannya. Terima kasih ~
GavinR
Saya pikir ini adalah jawaban yang paling nyaman bagi pengguna Linux. Terima kasih @ GavinR. chmod 777adalah mimpi buruk yang lengkap.
Abdalla Arbab
Ini bekerja untuk saya dan jelas merupakan pilihan yang lebih baik daripada chmod -777
Egnaro
Terima kasih atas cara baru dalam menyelesaikan masalah! Apakah kami perlu melakukan sesuatu sebelum / sesudah perintah Anda untuk membalikkan chmod 777konsekuensinya?
Aleksandar
41

Untuk semua orang yang menggunakan Laravel 5, Homestead dan Mac coba ini:

mkdir storage/framework/views
Hans P
sumber
Ini juga bekerja dengan membuat server baru dengan Laravel Forge dengan Laravel 5.2.7
winkster
2
Ini berhasil untuk saya. Sepertinya bootstrap/cache/compiled.phpsedang mencoba menulis ke direktori ini, tetapi tidak ada dan akhirnya melemparkan kesalahan izin. Terima kasih.
Matt K
1
Entah bagaimana ini berhasil bagi saya. Saya menggunakan laravel 5.1 btw
Yohanes Gultom
Ini berhasil untuk saya, terima kasih. Saya telah menghapus seluruh direktori penyimpanan saya dengan berpikir ini akan dihasilkan oleh laravel lagi, kira tidak.
grimmdude
33

beberapa kali SELINUX menyebabkan masalah ini; Anda dapat menonaktifkan selinux dengan perintah ini.

sudo setenforce 0
mahrad
sumber
wow, saya benar-benar melakukan trik dan berhasil, dapatkah seseorang menjelaskan kepada saya mengapa itu berhasil? apa itu selinux?
undefinedman
ya ini benar-benar berhasil! tolong bantu kami guru untuk memahami ini di SELINUX? Saya menggunakan fedora 24 btw
loki9
1
Terima kasih, terima kasih banyak. Saya mencari di internet, dan semua orang mengatakan kepada saya untuk memeriksa izin, memeriksa pengguna dan sebagainya ...
Ali ZahediGol
3
Ini pada dasarnya seperti mematikan seluruh firewall karena itu memblokir port yang Anda butuhkan terbuka.
Teh JoE
Saya belum pernah mendengar hal ini. "Linux yang Ditingkatkan Keamanan (SELinux) adalah modul keamanan kernel Linux yang menyediakan mekanisme untuk mendukung kebijakan keamanan kontrol akses." Saya ragu itu ide yang bagus untuk mematikannya. Dan saya yakin para upvoter secara membabi buta menggunakan perintah ini tanpa memahami konsekuensi penuh.
Ryan
18

Masalah terpecahkan

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

ini memungkinkan izin tulis untuk aplikasi, kerangka kerja, log Semoga ini bisa membantu

pengguna3470929
sumber
12
tidak pernah 777 ... di dev atau prod karena akan memberikan ilusi hal-hal yang bekerja di dev tetapi mereka akan pecah di prod kecuali 777 juga yang tidak pernah merupakan ide yang baik
Kyle Burkett
wooha Anda batu ... penjual adalah salah satu yang saya hilang
lu1s
ya, memberikan apa pun di web yang menghadap ke publik 777 adalah ide yang buruk
imabug
17

TIDAK PERNAH MEMBERI IZIN INI 777!

buka direktori proyek laravel di terminal Anda dan tulis:

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

Dengan cara ini Anda menjadikan pengguna Anda pemilik dan memberikan hak istimewa:
1 Jalankan, 2 Tulis, 4 Baca
1 + 2 + 4 = 7 berarti (rwx)
2 + 4 = 6 berarti (rw)
akhirnya, untuk akses penyimpanan, ug + rwx berarti Anda memberi pengguna dan grup 7

Ibrahim W.
sumber
1
saya tidak tahu mengapa banyak dev suka menggunakan 777 ... entah bagaimana mereka tidak peduli dengan sistem mereka ..
ZeroOne
15

Untuk pengguna gelandangan, solusinya adalah:

(dalam gelandangan) cache artisan php: hapus

(di luar gelandangan) chmod -R 777 aplikasi / penyimpanan

(dalam gelandangan) komposer dump-autoload

Pastikan Anda chmod di lingkungan lokal Anda dan tidak di dalam gelandangan penting di sini!

Brendan
sumber
6
bukankah 777 terlalu terbuka?
Simo
3
Maksud saya, untuk produksi, tentu saja. Tapi ini adalah lingkungan pengembang lokal. 777 adalah apa yang digunakan oleh poster asli, dan jawaban lain.775 atau 755 dapat bekerja tergantung.
Brendan
12

Coba lagi dengan chmod -R 755 /var/www/html/test/app/storage. Gunakan dengan sudo untuk Operation not permitteddi chmod. Gunakan Periksa izin pemilik jika masih ada kesalahan.

Khay
sumber
Tidak bekerja Semua direktori di dalam aplikasi memiliki izin drwxrwxrwx
vishnub1626
@tav dapatkah Anda memeriksa izin pemilik untuk folder pengujian Anda?
Khay
Drwxrwxrwx sama Memecahkan masalah menggunakan saran @ vsmoraes (lihat komentar)
vishnub1626
4
chmod 777 adalah risiko keamanan
Yogesh Kamat
9

Sesuai Laravel 5.4 yang merupakan yang terbaru saat saya menulis ini, jika Anda memiliki masalah seperti ini, Anda perlu mengubah izin. JANGAN MENDENGARKAN SIAPA PUN YANG MENGATAKAN ANDA UNTUK MENGATUR 777 UNTUK ARAH APA PUN. Ini memiliki masalah keamanan. Ubah izin folder penyimpanan seperti ini

sudo chmod -R 775 storage

Ubah izin folder bootstrap seperti ini

sudo chmod -R 775 bootstrap/cache

Sekarang pastikan Anda menjalankan kedua perintah dari direktori aplikasi Anda. Anda tidak akan menghadapi masalah di masa depan terkait izin. 775 tidak membahayakan keamanan mesin Anda.

Koushik Das
sumber
7

Sarankan izin yang benar, jika untuk Apache,

sudo chown -R apache:apache apppath/app/storage
Sean
sumber
Laravel Forge use: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy
6

Jika Anda memiliki Laravel 5 dan mencari solusi permanen, berlaku php artisanpenggunaan baris perintah dan server Apache menggunakan ini:

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

Lihat penjelasan rinci di sini .

alexeydemin
sumber
8
sepertinya ide yang buruk untuk menggunakan 777
Randy L
umask 000 di resolv.conf?! dari mana orang ini mendapatkan info ini? itu adalah baris yang tidak valid di resolv.conf. Tolong abaikan ini dan semua 777 "solusi" di luar sana
higuita
periksa url dan temukan tidak ada opsi umask di resolv.conf linux.die.net/man/5/resolv.conf
higuita
6

UNTUK SIAPA PUN YANG MENJALANKAN OS DENGAN SELINUX: Cara yang benar untuk memungkinkan httpd untuk menulis ke folder penyimpanan laravel adalah:

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

Kemudian untuk menerapkan perubahan segera:

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

SELinux bisa menjadi susah untuk dihadapi, tetapi jika itu ada maka saya SANGAT MENYARANKAN Anda mempelajarinya daripada melewatinya sepenuhnya.

Heather Gaye
sumber
masalah persis saya di centos 7 baru adalah serupa. itu mengatakan tidak ada izin untuk menulis tetapi semuanya 777 untuk pengujian. Jadi posting ini sebenarnya menghemat waktu saya setelah semua pemeriksaan umum.
MANUSIA
1
Ini adalah solusi yang tepat, meskipun saya pikir tipe SELinux yang benar harus httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug
4

Saya memiliki masalah yang sama dan langkah-langkah di bawah ini membantu saya memperbaiki masalah ini.

  1. Cari tahu pengguna apache - membuat file test.php di folder publik dengan kode

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

Dan jalankan file dari browser web. Itu akan memberi pengguna apache. Dalam kasus saya, ini adalah pengguna ec2 karena saya menggunakan aws dengan cronjob diinstal di /etc/cron.d/. Bisa jadi pengguna berbeda untuk orang lain.

  1. Jalankan perintah di bawah ini pada baris perintah.

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

Anda perlu mengidentifikasi dan menggunakan "pengguna" dan "grup pengguna" yang tepat di sini.

KiranD
sumber
4

Jika Anda menggunakan Linux atau Mac, bahkan Anda juga bisa menjalankan ssh terminal. Anda dapat menggunakan terminal untuk menjalankan perintah ini,

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

Jika Anda menggunakan windows, Anda dapat menjalankan menggunakan git bash.

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

Anda dapat mengunduh formulir git https://git-scm.com/downloads .

Rasheduzzaman
sumber
3

Xampp untuk digunakan:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
Cristianojeda
sumber
1
dapatkah Anda sedikit lebih memecah belah ini?
Aaron Hall
Saya Menggunakan artikel ini, dan saya: Menyiapkan Laravel 4.x pada Mac OSX 10.8+ dengan XAMPP
cristianojeda
3
chmod 777 adalah risiko keamanan
Yogesh Kamat
1
Anda juga dapat menggunakan chmod 775
cristianojeda
2

Setiap kali saya mengubah app.php, saya mendapat izin untuk tidak menulis bootstrap / cache / services.json jadi saya melakukan ini untuk memperbaikinya:

chmod -R 777 bootstrap/cache/
jahat
sumber
8
chmod 777 adalah risiko keamanan
Yogesh Kamat
2
rm storage/logs/laravel.log  

memecahkan ini untukku

aad1992
sumber
2

Menetapkan izin ke 777 adalah ide yang sangat buruk!

... tapi

Jika Anda mendapatkan kesalahan izin terhubung dengan folder "penyimpanan", itulah yang berhasil bagi saya:

1) Atur "penyimpanan" dan izin subfoldernya ke 777 dengan

sudo chmod -R 777 storage/

2) Di browser, buka laravel home page laravel / public / (laravel akan membuat file penyimpanan awal yang diperlukan)

3) Kembalikan izin 775 aman ke penyimpanan dan subfoldernya

sudo chmod -R 775 storage/
Nika Tsogiaidze
sumber
2

Jika menggunakan laradock, coba chown -R laradock:www-data ./storagedi wadah ruang kerja Anda

Rob L
sumber
1

Dalam kasus saya, solusinya adalah mengubah izin app/storage/framework/viewsdan app/storage/logsdirektori.

Sarang
sumber
0

Jika orang lain mengalami masalah yang sama dengan kesalahan izin file fopen, tetapi cukup bijak untuk tidak membabi buta chmod 777 di sini adalah saran saya.

Periksa perintah yang Anda gunakan untuk izin yang dibutuhkan apache:

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

'R' berarti terbuka hanya untuk dibaca, dan jika Anda tidak mengedit file, ini adalah apa yang seharusnya Anda atur. Ini berarti apache / www-data membutuhkan setidaknya membaca izin pada file itu, yang jika file dibuat melalui laravel maka sudah akan memiliki izin membaca.

Jika karena alasan apa pun Anda harus menulis ke file:

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

Kemudian pastikan apache juga memiliki izin untuk menulis ke file tersebut.

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

Kyle Burkett
sumber
0

Mulai saja menggunakan server Anda artisian

php artisian serve

Kemudian akses proyek Anda dari URL yang ditentukan:

masukkan deskripsi gambar di sini

wajih
sumber
0

Saya memiliki masalah yang sama ketika menjalankan gelandangan di mac. memecahkan masalah dengan mengubah pengguna server Apache dalam file https.conf:

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

Jalankan apache di bawah pengguna php, bukan daemon pengguna untuk menyelesaikan masalah akses file dengan 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

sekarang, file cache yang dibuat php dapat dibaca dan diedit dengan apache tanpa menunjukkan kesalahan izin akses.

nigam214
sumber
0

Setelah banyak percobaan dan kesalahan dengan izin direktori saya berakhir dengan pencerahan ... tidak ada ruang yang tersisa di partisi disk. Hanya ingin berbagi untuk memastikan tidak ada orang lain yang cukup bodoh untuk terus mencari solusi ke arah yang salah.

Di Linux, Anda dapat menggunakan df -huntuk memeriksa ukuran disk dan ruang kosong Anda.

jujur
sumber
0

Masalah ini sebenarnya disebabkan oleh berbagai pengguna yang ingin write/read mengajukan tetapi ditolak menyebabkan kepemilikan yang berbeda. mungkin Anda sebagai 'root' menginstal laravel sebelum kemudian Anda masuk ke situs Anda sebagai pengguna 'laravel' di mana 'laravel' kepemilikan default, jadi ini adalah masalah sebenarnya di sini. Jadi ketika pengguna 'laravel' ingin membaca / menulis semua file dalam disk sebagai default, untuk ditolak, menyebabkan file tersebut memiliki kepemilikan oleh 'root'.

Untuk mengatasi masalah ini, Anda dapat mengikuti seperti ini:

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

atau dalam kasus saya

sudo chown -hR igmcoid /root /sublaravel

Catatan kaki:

  1. root sebagai nama kepemilikan pertama yang diinstal sebelumnya
  2. your-user-name sebagai kepemilikan default yang benar-benar menulis / membaca di situs.
  3. namefolder sebagai folder nama yang ingin Anda ubah kepemilikannya.
Bliss Jaspis
sumber
0

Saya mendapat kesalahan yang sama dalam proyek saya ...
Tetapi ternyata saya lupa memasukkan enctypeformulir saya.

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

Semoga ini bisa membantu entah di mana ...

Vpa
sumber
0

Saat bekerja pada Windows 10 dengan Laragon dan Laravel 4, bagi saya tampaknya tidak ada cara untuk mengubah izin secara manual, karena menjalankan- chmodperintah di terminal Laragon-in-built-terminal tidak berpengaruh.

Namun, ada kemungkinan di terminal ini untuk pergi ke folder penyimpanan dan secara manual menambahkan folder yang diinginkan seperti ini:

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

Perintah- cddi terminal membawa Anda ke folder (Anda mungkin perlu menyesuaikan jalur ini agar sesuai dengan struktur file Anda). Itumkdir akan membuat direktori dengan nama yang diberikan.

Saya tidak memiliki kesempatan untuk menguji pendekatan ini di Laravel 5, tetapi saya berharap bahwa pendekatan yang sama akan berhasil.

Tentu saja mungkin ada cara yang lebih baik, tetapi setidaknya ini adalah solusi yang masuk akal untuk situasi saya (memperbaiki kesalahan:) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.

Virginia
sumber
-1
  1. Pertama, hapus folder penyimpanan lalu buat lagi folder penyimpanan.
  2. Folder penyimpanan di dalam membuat nama folder baru sebagai kerangka kerja.
  3. Di dalam folder framework buat tiga nama folder sebagai cache, sesi dan tampilan.

Saya telah memecahkan masalah saya dengan melakukan ini.

Md Juyel Rana
sumber
-4

Saya telah mencoba memberikan 777akses ke folder penyimpanan dan itu berfungsi untuk saya

1) pergi ke direktori root laravel Anda, ( /var/www/htmluntuk saya) dan jalankan perintah berikut

chmod 777 -R storage
Yur Gasparyan
sumber
2
Jangan atur izin ke 777 karena ini membuat direktori terlihat dan dapat diedit untuk semua orang yang bisa melihat direktori itu. Ini tidak direkomendasikan!
CodeNinja