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:
require "/path/to/file"
Daftar periksa
1. Periksa path file untuk kesalahan ketik
- baik memeriksa secara manual (dengan memeriksa jalan secara visual)
atau memindahkan apa pun yang dipanggil oleh require*
atau include*
ke variabelnya sendiri, menggemakannya, menyalinnya, dan mencoba mengaksesnya dari terminal:
$path = "/path/to/file";
echo "Path : $path";
require "$path";
Kemudian, di terminal:
cat <file path pasted>
2. Periksa apakah jalur file benar tentang pertimbangan jalur relatif vs absolut
- jika dimulai dengan garis miring "/" maka itu tidak merujuk ke akar folder situs web Anda (akar dokumen), tetapi ke akar server Anda.
- misalnya, direktori situs web Anda mungkin
/users/tony/htdocs
- jika tidak dimulai dengan garis miring ke depan maka ia bisa mengandalkan jalur sertakan (lihat di bawah) atau jalur tersebut relatif. Jika relatif, maka PHP akan menghitung relatif ke jalur direktori kerja saat ini .
- dengan demikian, tidak relatif terhadap jalur root situs web Anda, atau ke file tempat Anda mengetik
- untuk alasan itu, selalu gunakan jalur file absolut
Praktik terbaik :
Untuk membuat skrip Anda tangguh jika Anda memindahkan banyak hal, sambil tetap menghasilkan path absolut saat runtime, Anda memiliki 2 opsi:
- gunakan
require __DIR__ . "/relative/path/from/current/file"
. The __DIR__
magic konstan mengembalikan direktori dari file saat ini.
tentukan SITE_ROOT
konstanta sendiri:
- di root direktori situs web Anda, buat file, mis
config.php
di config.php
, tulis
define('SITE_ROOT', __DIR__);
di setiap file tempat Anda ingin mereferensikan folder root situs, sertakan config.php
, dan kemudian gunakan SITE_ROOT
konstanta di mana pun Anda suka:
require_once __DIR__."/../config.php";
...
require_once SITE_ROOT."/other/file.php";
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:
include "Zend/Mail/Protocol/Imap.php"
Dalam hal ini, Anda harus memastikan bahwa folder tempat "Zend" berada, adalah bagian dari path include.
Anda dapat memeriksa jalur sertakan dengan:
echo get_include_path();
Anda dapat menambahkan folder ke dalamnya dengan:
set_include_path(get_include_path().":"."/path/to/new/folder");
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 :
$user = posix_getpwuid(posix_geteuid());
var_dump($user);
Untuk mengetahui izin pada file, ketikkan perintah berikut di terminal:
ls -l <path/to/file>
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:
- open_basedir
- Jika ini diatur, PHP tidak akan dapat mengakses file apa pun di luar direktori yang ditentukan (bahkan melalui tautan simbolik).
- Namun, perilaku default adalah untuk tidak diatur dalam hal ini tidak ada batasan
- Ini dapat diperiksa dengan menelepon
phpinfo()
atau menggunakanini_get("open_basedir")
- Anda dapat mengubah pengaturan dengan mengedit file php.ini atau file httpd.conf Anda
- mode aman
- jika ini diaktifkan pembatasan mungkin berlaku. Namun, ini telah dihapus dalam PHP 5.4. Jika Anda masih pada versi yang mendukung peningkatan mode aman ke versi PHP yang masih didukung .
- allow_url_fopen dan allow_url_include
- ini hanya berlaku untuk memasukkan atau membuka file melalui proses jaringan seperti http: // tidak ketika mencoba untuk memasukkan file pada sistem file lokal
- ini dapat diperiksa
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 :
require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"
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:
include "Zend/Mail/Protocol/Exception.php"
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.
setenforce 0
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 membaca
httpd_sys_rw_content_t
untuk file yang ingin Anda baca dan tulis aksesnya
httpd_log_t
untuk file log
httpd_cache_t
untuk direktori cache
Misalnya, untuk menetapkan httpd_sys_content_t
tipe konteks ke direktori root situs web Anda, jalankan:
semanage fcontext -a -t httpd_sys_content_t "/path/to/root(/.*)?"
restorecon -Rv /path/to/root
Jika file Anda ada di direktori home, Anda juga perlu mengaktifkan httpd_enable_homedirs
boolean:
setsebool -P httpd_enable_homedirs 1
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:
cache:clear
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