file_put_contents - gagal membuka aliran: Izin ditolak

97

Saya mencoba menulis kueri ke file untuk debugging. File dalam format database/execute.php. File yang ingin saya tulis adalah database/queries.php.

Saya mencoba menggunakan file_put_contents('queries.txt', $query)

Tapi saya mendapatkan

file_put_contents (queries.txt) [function.file-put-content]: gagal membuka aliran: Izin ditolak

Saya memiliki queries.txtfile chmod'd ke 777, apa masalahnya?

Hailwood
sumber
Pernahkah Anda memeriksa php.inifile untuk mencari sesuatu yang mungkin menolak akses file?
Halo71
2
juga pastikan direktori tersebut di-chmod dengan benar
Crayon Violent
1
juga coba gunakan nama file absolut. Mungkin saja interpretasi Anda tentang folder saat ini berbeda dari PHP
laher
1
Bisakah Anda memeriksa ulang status chmod itu?
Yunus
1
Ada daftar periksa pemecahan masalah untuk masalah semacam ini: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

Jawaban:

73

Coba sesuaikan izin direktori.

dari terminal, jalankan chmod 777 database(dari direktori yang berisi folder database)

apache dan tak seorang pun akan memiliki akses ke direktori ini jika di-chmodd dengan benar.

Hal lain yang harus dilakukan adalah echo "getcwd ()". Ini akan menunjukkan direktori saat ini, dan jika ini bukan '/something.../database/' maka Anda harus mengubah 'query.txt' ke jalur lengkap untuk server Anda.

Jason
sumber
104
Bukankah 777 merupakan resiko keamanan?
hitautodestruct
12
Saya sangat curiga bahwa direktori target tidak hanya harus dapat ditulisi oleh akun server, tetapi setiap direktori induk dari direktori target harus mengizinkan akun server untuk menavigasi ke dalamnya; Saya pikir ini akan menjadi + x untuk izin.
Erhannis
2
Saya bereksperimen dengan teori Erhannis pada tumpukan LAMP baru dan teorinya benar.
thotheolh
4
@MajidFouladpour Saya rasa chmod +x /parent/directory, untuk setiap direktori induk dari target. chmod +x /parent/directory,, chmod +x /parentdll.
Erhannis
1
Sekarang ada daftar periksa pemecahan masalah untuk masalah semacam ini: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew
18

Pilihan lainnya

adalah yang dapat Anda jadikan Apache (www-data)sebagai pemilik folder

sudo chown -R www-data:www-data /var/www

yang seharusnya file_put_contentsberhasil sekarang. Tetapi untuk keamanan lebih baik Anda juga mengatur izin seperti di bawah ini

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • ubah /var/wwwke folder root dari file php Anda
azerafati.dll
sumber
7

Sadarilah bahwa ini sudah cukup lama sekarang, tetapi tidak perlu menulis kueri secara manual ke file seperti ini. MySQL memiliki dukungan logging bawaan, Anda hanya perlu mengaktifkannya dalam lingkungan dev Anda.

Lihat dokumentasi untuk 'log kueri umum':

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Adam
sumber
3

Teman-teman Saya mengalami masalah ini selama 1 bulan dan melakukan semuanya tetapi tidak dapat memperbaikinya, tetapi sekarang saya tahu solusinya.

Saya menggunakan shared hosting linux, ketika admin saya mengubah php menjadi 5.3 saya mendapat banyak error untuk kode "file_put_contents". coba uji rencanaku:

Di host Anda, buat file seperti mytest.php, dan masukkan kode ini dan simpan:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Buka URL "www.your-domain.com/mytest.php" satu kali dan kemudian periksa email Anda. Anda harus memiliki email dari host Anda dengan informasi yang Anda masukkan di mytest.php, periksa nama pengirimnya. jika itu dari Tidak Ada Anda memiliki masalah tentang "Izin Ditolak" karena sesuatu tidak ditentukan dan jika nama pengirim seperti id saya: [email protected] Anda tidak punya masalah.

Admin saya mengubah server dan menginstal host lagi, saya pikir dan masalahnya teratasi, beri tahu administrasi host Anda apa yang saya katakan dan mungkin mereka menemukan jawabannya.

semoga membantu Anda!

Hesam
sumber
Aku benar-benar tersesat !! Apa yang kamu coba katakan? Jika Anda mengatakan bahwa pengguna apache tidak bisa mendapatkan nama host di server (bersama atau apa pun), maka sudah saatnya Anda mempertimbangkan kembali pilihan layanan hosting Anda.
Fr0zenFyr
3

Saya tahu bahwa ini adalah pertanyaan yang sangat lama, tetapi saya ingin menambahkan solusi yang baik dengan penjelasan yang mendalam. Anda harus menjalankan dua pernyataan pada sistem seperti Ubuntu dan kemudian berfungsi seperti pesona.

Izin di Linux dapat direpresentasikan dengan tiga digit. Digit pertama menunjukkan izin dari pemilik file. Digit kedua izin dari grup pengguna tertentu. Digit ketiga mendefinisikan izin untuk semua pengguna yang bukan pemilik maupun anggota grup.

Server web seharusnya dijalankan dengan id yang merupakan anggota grup. Server web tidak boleh berjalan dengan id yang sama dengan pemilik file dan direktori. Di Ubuntu menjalankan apache di bawah id www-data. Id itu harus menjadi anggota grup yang izinnya ditentukan.

Untuk memberi direktori tempat Anda ingin mengubah konten file hak yang tepat, jalankan pernyataan:

find %DIR% -type d -exec chmod 770 {} \;

Itu akan menyiratkan dalam pertanyaan OP bahwa izin untuk direktori% ROOT% / database harus diubah sesuai. Oleh karena itu, penting untuk tidak memiliki file dalam direktori itu yang tidak boleh diubah, atau dihapus. Oleh karena itu, praktik terbaik adalah membuat direktori terpisah untuk file yang isinya harus diubah.

Izin membaca (4) untuk direktori berarti dapat mengumpulkan semua file dan direktori dengan metadatanya di dalam direktori. Izin menulis (2) memberikan izin untuk mengubah konten direktori. Menyiratkan menambah dan menghapus file, mengubah izin, dll. Izin eksekusi (1) berarti Anda berhak masuk ke direktori itu. Tanpa yang terakhir ini tidak mungkin untuk masuk lebih dalam ke direktori. Server web membutuhkan izin baca, tulis, dan eksekusi ketika konten file harus diubah. Untuk itu perlu kelompok angka 7.

Pernyataan kedua adalah dalam pertanyaan OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Mampu membaca dan menulis dokumen diperlukan, tetapi tidak diharuskan untuk menjalankan file. 7 diberikan kepada pemilik file, 6 untuk grup. Server web tidak perlu memiliki izin untuk mengeksekusi file untuk mengubah isinya. Izin menulis tersebut hanya boleh diberikan ke file di direktori itu.

Semua pengguna lain tidak boleh diberi izin apa pun.

Untuk direktori yang tidak perlu mengubah file-nya adalah izin grup 5 yang cukup. Dokumentasi tentang perizinan dan beberapa contoh:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

Loek Bergman
sumber
3

Mengumpulkan info dari tautan ini penyimpanan gambar stackoverflow tidak berfungsi dengan chmod 777 dan dari pengguna azerafati dan Loek Bergman

jika Anda melihat di bawah file / etc / apache / envvars Anda akan melihat sesuatu seperti:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache dijalankan dengan nama pengguna 'www-data'

'0755' berarti pemilik file dapat membaca / menulis / mengeksekusi tetapi grup dan pengguna lain tidak dapat menulis. jadi di terminal Anda, cd ke folder yang berisi folder 'gambar' Anda. lalu ketik:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

Anda harus mengubah persepsi terlebih dahulu sebelum mengganti pemilik. masukkan kata sandi Anda saat diminta. ini akan menjadikan 'www-data' sebagai pemilik folder gambar.

unggahan Anda sekarang harus berfungsi.

Bruce Tong
sumber
1

Untuk siapa saja yang menggunakan Ubuntu dan menerima kesalahan ini saat memuat halaman secara lokal, tetapi tidak pada layanan hosting web,

Saya baru saja memperbaikinya dengan membuka nautilus ( sudo nautilus) dan klik kanan pada file yang Anda coba buka, klik properti> Pengaturan> dan berikan baca tulis ke 'semua orang'

d -_- b
sumber
0

memiliki masalah yang sama; masalah saya adalah selinux diatur untuk menegakkan.

Saya terus mendapatkan kesalahan "gagal membuka aliran: Izin ditolak" bahkan setelah chmoding ke 777 dan memastikan semua folder induk telah menjalankan izin untuk pengguna apache. Ternyata masalah saya adalah bahwa selinux diatur untuk diberlakukan (saya menggunakan centos7), ini adalah kotak dev jadi saya mematikannya.

DaveS
sumber
0

Ini dapat diatasi dengan langkah-langkah berikut:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Semoga membantu


sumber
0

Jika Anda menarik dari git dari lokal ke server, Anda terkadang perlu menghapus cache karena file tampilan yang diunggah dengannya / atau file cache lainnya.

php artisan cache:clear

Terkadang itu mungkin hanya untuk trik jika aplikasi Anda berfungsi sebelum git pull

Deepesh Thapa
sumber
0

ini mungkin bisa membantu. Itu berhasil untuk saya. coba di terminal

setenforce 0

Lithin Joseph
sumber
-2

Ada 2 cara untuk mengatasi masalah ini
1. gunakan chmod 777 path-to-your-directory.
jika tidak berhasil maka
cukup berikan path lengkap dari file Anda query.txt.

Salman Mohammad
sumber
2
Ini adalah praktik yang sangat tidak aman dan sangat buruk. Ini juga sulit untuk dideteksi dan diperbaiki saat mengembangkan aplikasi kustom dan dapat dengan mudah diabaikan. Harap benar-benar mencari tahu izin yang tepat.
ftrotter
-3

Berikut solusinya. Untuk menyalin sebuah img dari URL. URL ini:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

buat jalur yang diinginkan, selesaikan nama dengan .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)
masterhoo
sumber
-11

Selanjutnya, seperti yang dikatakan file_put_contents man pagedi php.net, berhati-hatilah terhadap masalah penamaan.

file_put_contents($dir."/file.txt", "hello");

mungkin tidak berfungsi (meskipun sintaksnya benar), tetapi

file_put_contents("$dir/file.txt", "hello");

bekerja. Saya mengalami ini di server yang diinstal php berbeda.

Kivanc
sumber
17
Ini tidak benar. $dir."/file.txt"secara fungsional setara dengan "$dir/file.txt"dalam semua kasus, dengan asumsi $diradalah string. Lebih lanjut, perilaku ini tidak didokumentasikan di php.net, seperti klaim Kivanc.
mattbasta