Dalam skrip PHP, apakah menelepon include()
, require()
, fopen()
, atau turunannya seperti include_once
, require_once
, atau bahkan, move_uploaded_file()
, satu sering berjalan ke kesalahan atau peringatan:
Gagal membuka aliran: Tidak ada file atau direktori seperti itu.
Apa proses yang baik untuk menemukan akar penyebab masalah dengan cepat?
php
require
fopen
include-path
Vic Seedoubleyew
sumber
sumber
Jawaban:
Ada banyak alasan mengapa orang mungkin mengalami kesalahan ini dan dengan demikian daftar periksa yang baik tentang apa yang harus diperiksa terlebih dahulu sangat membantu.
Mari kita pertimbangkan bahwa kita memecahkan masalah pada baris berikut:
Daftar periksa
1. Periksa path file untuk kesalahan ketik
atau memindahkan apa pun yang dipanggil oleh
require*
atauinclude*
ke variabelnya sendiri, menggemakannya, menyalinnya, dan mencoba mengaksesnya dari terminal:Kemudian, di terminal:
2. Periksa apakah jalur file benar tentang pertimbangan jalur relatif vs absolut
/users/tony/htdocs
Praktik terbaik :
Untuk membuat skrip Anda tangguh jika Anda memindahkan banyak hal, sambil tetap menghasilkan path absolut saat runtime, Anda memiliki 2 opsi:
require __DIR__ . "/relative/path/from/current/file"
. The__DIR__
magic konstan mengembalikan direktori dari file saat ini.tentukan
SITE_ROOT
konstanta sendiri:config.php
di
config.php
, tulisdi setiap file tempat Anda ingin mereferensikan folder root situs, sertakan
config.php
, dan kemudian gunakanSITE_ROOT
konstanta di mana pun Anda suka:2 praktik ini juga membuat aplikasi Anda lebih portabel karena tidak bergantung pada pengaturan ini seperti jalur sertakan.
3. Periksa jalur sertakan Anda
Cara lain untuk memasukkan file, baik relatif maupun murni, adalah dengan mengandalkan path include . Ini sering terjadi untuk perpustakaan atau kerangka kerja seperti kerangka kerja Zend.
Inklusi seperti itu akan terlihat seperti ini:
Dalam hal ini, Anda harus memastikan bahwa folder tempat "Zend" berada, adalah bagian dari path include.
Anda dapat memeriksa jalur sertakan dengan:
Anda dapat menambahkan folder ke dalamnya dengan:
4. Pastikan server Anda memiliki akses ke file itu
Mungkin secara keseluruhan, pengguna yang menjalankan proses server (Apache atau PHP) sama sekali tidak memiliki izin untuk membaca atau menulis ke file itu.
Untuk memeriksa di bawah pengguna apa server berjalan Anda dapat menggunakan posix_getpwuid :
Untuk mengetahui izin pada file, ketikkan perintah berikut di terminal:
dan lihat notasi simbolis izin
5. Periksa pengaturan PHP
Jika tidak ada di atas yang berfungsi, maka masalahnya mungkin beberapa pengaturan PHP melarangnya untuk mengakses file itu.
Tiga pengaturan mungkin relevan:
phpinfo()
atau menggunakanini_get("open_basedir")
ini_get("allow_url_include")
dan diatur denganini_set("allow_url_include", "1")
Kasus sudut
Jika tidak ada yang di atas diaktifkan untuk mendiagnosis masalah, berikut adalah beberapa situasi khusus yang dapat terjadi:
1. Dimasukkannya perpustakaan mengandalkan jalur sertakan
Ini bisa terjadi bahwa Anda menyertakan perpustakaan, misalnya, kerangka kerja Zend, menggunakan jalur relatif atau absolut. Sebagai contoh :
Tapi kemudian Anda masih mendapatkan jenis kesalahan yang sama.
Ini bisa terjadi karena file yang Anda miliki (berhasil) sertakan, memiliki sendiri pernyataan sertakan untuk file lain, dan pernyataan sertakan kedua mengasumsikan bahwa Anda telah menambahkan lintasan pustaka itu ke path sertakan.
Misalnya, file kerangka kerja Zend yang disebutkan sebelumnya dapat memiliki yang berikut ini termasuk:
yang bukan merupakan inklusi oleh jalur relatif, maupun oleh jalur absolut. Diasumsikan bahwa direktori framework Zend telah ditambahkan ke path include.
Dalam kasus seperti itu, satu-satunya solusi praktis adalah menambahkan direktori ke jalur sertakan Anda.
2. SELinux
Jika Anda menjalankan Linux yang Ditingkatkan Keamanan, maka itu mungkin menjadi alasan masalah, dengan menolak akses ke file dari server.
Untuk memeriksa apakah SELinux diaktifkan di sistem Anda, jalankan
sestatus
perintah di terminal. Jika perintah tidak ada, maka SELinux tidak ada di sistem Anda. Jika memang ada, maka harus memberi tahu Anda apakah itu dipaksakan atau tidak.Untuk memeriksa apakah kebijakan SELinux adalah penyebab masalahnya, Anda dapat mematikannya sementara. Namun berhati-hatilah, karena ini akan menonaktifkan perlindungan sepenuhnya. Jangan lakukan ini di server produksi Anda.
Jika Anda tidak lagi memiliki masalah dengan SELinux dimatikan, maka ini adalah akar penyebabnya.
Untuk mengatasinya , Anda harus mengkonfigurasi SELinux.
Jenis konteks berikut akan diperlukan:
httpd_sys_content_t
untuk file yang Anda inginkan agar server Anda dapat membacahttpd_sys_rw_content_t
untuk file yang ingin Anda baca dan tulis aksesnyahttpd_log_t
untuk file loghttpd_cache_t
untuk direktori cacheMisalnya, untuk menetapkan
httpd_sys_content_t
tipe konteks ke direktori root situs web Anda, jalankan:Jika file Anda ada di direktori home, Anda juga perlu mengaktifkan
httpd_enable_homedirs
boolean:Bagaimanapun, mungkin ada berbagai alasan mengapa SELinux akan menolak akses ke file, tergantung pada kebijakan Anda. Jadi, Anda perlu menanyakan hal itu. Berikut ini adalah tutorial khusus tentang mengkonfigurasi SELinux untuk server web.
3. Symfony
Jika Anda menggunakan Symfony, dan mengalami kesalahan ini saat mengunggah ke server, bisa jadi cache aplikasi belum disetel ulang, baik karena
app/cache
telah diunggah, atau cache itu belum dihapus.Anda dapat menguji dan memperbaikinya dengan menjalankan perintah konsol berikut:
4. Non ACSII karakter di dalam file Zip
Rupanya, kesalahan ini dapat terjadi juga saat memanggil
zip->close()
ketika beberapa file di dalam zip memiliki karakter non-ASCII dalam nama file mereka, seperti "é".Solusi potensial adalah membungkus nama file
utf8_decode()
sebelum membuat file target.Penghargaan kepada Fran Cano untuk mengidentifikasi dan menyarankan solusi untuk masalah ini
sumber
selinux
mungkin ide yang bagus di sini. Anda setidaknya akan membutuhkanhttpd_sys_content_t
(direktori Read-only dan file yang digunakan oleh Apache) izin pada file yang disertakan.chcon
bersifat sementara dan tidak akan bertahanrestorecon
atau reboot. Anda mungkin perlu menggunakansemanage
untuk mengubah konteks file. Berikut ini adalah tutorial sederhana yangUntuk menambah jawaban (sangat bagus) yang ada
Perangkat Lunak Hosting Bersama
open_basedir
adalah salah satu yang dapat membuat Anda bingung karena dapat ditentukan dalam konfigurasi server web. Meskipun hal ini mudah diperbaiki jika Anda menjalankan server khusus Anda, ada beberapa paket perangkat lunak hosting bersama di luar sana (seperti Plesk, cPanel, dll.) Yang akan mengonfigurasi arahan konfigurasi berdasarkan per-domain. Karena perangkat lunak membuat file konfigurasi (yaituhttpd.conf
) Anda tidak dapat mengubah file itu secara langsung karena perangkat lunak hosting hanya akan menimpanya ketika restart.Dengan Plesk, mereka menyediakan tempat untuk menimpa tersedia
httpd.conf
disebutvhost.conf
. Hanya admin server yang dapat menulis file ini. Konfigurasi untuk Apache terlihat seperti iniMintalah admin server Anda membaca manual untuk hosting dan perangkat lunak server web yang mereka gunakan.
Izin File
Penting untuk dicatat bahwa mengeksekusi file melalui server web Anda sangat berbeda dari baris perintah atau eksekusi pekerjaan cron. Perbedaan besar adalah bahwa server web Anda memiliki pengguna dan izinnya sendiri. Demi keamanan, pengguna dibatasi. Apache, misalnya, sering
apache
,www-data
atauhttpd
(tergantung pada server Anda). Pekerjaan cron atau eksekusi CLI memiliki izin apa pun yang dijalankan pengguna (mis. Menjalankan skrip PHP sebagai root akan dijalankan dengan izin root).Banyak kali orang akan memecahkan masalah izin dengan melakukan hal berikut (contoh Linux)
Ini bukan ide yang cerdas, karena file atau direktori sekarang dapat ditulisi dunia. Jika Anda memiliki server dan merupakan satu-satunya pengguna maka ini bukan masalah besar, tetapi jika Anda berada di lingkungan hosting bersama, Anda baru saja memberi semua orang akses server Anda.
Yang perlu Anda lakukan adalah menentukan pengguna yang membutuhkan akses dan hanya memberi mereka akses. Setelah Anda tahu pengguna mana yang membutuhkan akses, Anda ingin memastikannya
Pengguna itu memiliki file dan mungkin direktori induk (terutama direktori induk jika Anda ingin menulis file). Di sebagian besar lingkungan hosting bersama, ini tidak akan menjadi masalah, karena pengguna Anda harus memiliki semua file di bawah root Anda. Contoh Linux ditunjukkan di bawah ini
Pengguna, dan hanya pengguna itu, yang memiliki akses. Di Linux, praktik yang baik adalah
chmod 600
(hanya pemilik yang dapat membaca dan menulis) atauchmod 644
(pemilik dapat menulis tetapi semua orang dapat membaca)Anda dapat membaca diskusi yang lebih luas tentang izin dan pengguna Linux / Unix di sini
sumber
Kode saya bekerja dengan baik pada semua mesin tetapi hanya yang ini mulai memberi masalah (yang dulu berfungsi saya kira). Digunakan jalur echo "document_root" untuk debug dan juga melihat dari dekat kesalahan, menemukan ini
Anda dapat dengan mudah melihat di mana masalahnya. Masalahnya adalah // sebelum fungsi
Jadi cukup hapus lading / dari include dan itu akan berfungsi dengan baik. Yang menarik adalah perilaku ini berbeda pada versi yang berbeda. Saya menjalankan kode yang sama pada Laptop, Macbook Pro dan PC ini, semua berfungsi dengan baik sampai sekarang. Semoga ini bisa membantu seseorang.
sumber
Tambahkan skrip dengan parameter kueri
Itu kasus saya. Sebenarnya tautan ke pertanyaan # 4485874 , tapi saya akan menjelaskannya di sini segera.
Ketika Anda mencoba untuk meminta
path/to/script.php?parameter=value
, PHP mencari file bernamascript.php?parameter=value
, karena UNIX memungkinkan Anda untuk memiliki jalur seperti ini.Jika Anda benar-benar harus lulus beberapa data script termasuk, hanya mendeklarasikan sebagai
$variable=...
atau$GLOBALS[]=...
atau lainnya cara Anda seperti.sumber
Saham Samba
Jika Anda memiliki server uji Linux dan Anda bekerja dari Klien Windows, berbagi Samba mengganggu perintah chmod . Jadi, bahkan jika Anda menggunakan:
di sisi Linux sangat mungkin bahwa data Unix Group \ www masih tidak memiliki akses tulis. Satu solusi yang berfungsi jika bagian Anda disetel agar admin Windows dipetakan untuk di-root: Dari Windows, buka Izin, nonaktifkan Warisan untuk folder Anda dengan salinan, dan kemudian berikan akses penuh untuk data-www.
sumber
Penyebab lain yang mungkin: Mengganti nama dan / atau memindahkan file saat berada di editor teks. Saya melewati semua langkah di atas tanpa berhasil sampai saya menghapus file yang terus melempar kesalahan ini dan membuat yang baru, yang memperbaiki masalah.
sumber