Saya telah mencari tinggi dan rendah dan mendapatkan banyak solusi dan variabel yang berbeda yang berisi info untuk mendapatkan jalur absolut. Tetapi mereka tampaknya bekerja dalam beberapa kondisi dan tidak dalam kondisi lain. Apakah ada satu cara ampuh untuk mendapatkan path absolut dari skrip yang dieksekusi dalam PHP? Bagi saya, skrip akan dijalankan dari baris perintah, tetapi, solusi harus berfungsi sama baiknya jika dijalankan di dalam Apache dll.
Klarifikasi: Skrip yang awalnya dieksekusi, tidak harus berupa file tempat solusi dikodekan.
Jawaban:
Solusi yang benar adalah dengan menggunakan
get_included_files
fungsi ini:Ini akan memberi Anda jalan absolut dari skrip awal bahkan jika:
Berikut ini dua skrip uji; skrip utama dan file yang disertakan:
Dan hasilnya; perhatikan direktori saat ini:
sumber
get_included_files()
. Saya menyarankan untuk menyimpan__FILE__
konstanta di awal skrip yang seharusnya dijalankan.__FILE__
konstanta akan memberi Anda path absolut ke file saat ini.Perbarui :
Pertanyaan diubah untuk menanyakan cara mengambil skrip yang awalnya dijalankan alih-alih skrip yang saat ini berjalan. Satu-satunya cara yang dapat diandalkan untuk melakukan itu adalah dengan menggunakan
debug_backtrace
fungsi tersebut.sumber
__FILE__
mengembalikan lokasi index.php atau lokasi file yang disertakan? Bagaimana saya mendapatkan lokasi index.php?__FILE__
memang menunjuk ke jalur skrip saat ini. Tapi saya belum menemukan apa pun untuk menunjukkan jalur index.php saat ini.Jawaban telah dipindahkan di sini - https://stackoverflow.com/a/26944636/2377343
sumber
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
Jika Anda menempatkan ini dalam file yang disertakan, ia akan mencetak path ke ini termasuk. Untuk mendapatkan lintasan skrip induk, ganti
__FILE__
dengan$_SERVER['PHP_SELF']
. Namun ketahuilah bahwa PHP_SELF adalah risiko keamanan!sumber
__FILE__
selalu berisi jalur absolut dengan symlink diselesaikan sementara di versi yang lebih lama berisi jalur relatif dalam beberapa keadaan." plus "dirname () beroperasi secara naif pada input string, dan tidak mengetahui filesystem yang sebenarnya, atau komponen path seperti '..'.PHP_SELF
??Dari manual :
Catatan :
__DIR__
ditambahkan dalam PHP 5.3.0.sumber
Jika Anda ingin mendapatkan penggunaan direktori kerja saat ini
getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
akan mengembalikan path dengan nama file misalnya pada XAMPPC:\xampp\htdocs\index.php
bukanC:\xampp\htdocs\
sumber
akan memberikan rute absolut dari file saat ini dari mana Anda menuntut rute, rute direktori server Anda.
contoh file:
www / http / html / index.php; jika Anda menempatkan kode ini di dalam index.php Anda akan kembali:
<?php echo dirname(__FILE__); // this will return: www/http/html/
www / http / html / class / myclass.php; jika Anda menempatkan kode ini di dalam myclass.php Anda akan kembali:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
sumber
Cukup gunakan di bawah ini:
sumber
a.php->b.php->c.php
harus menjadi jalur a.php jika dicentang di c.php . Satu-satunya cara yang tampaknya dapat diandalkan adalah dengan menggunakan fungsi debug_backtrace () .itu memberi Anda skrip saat ini (skrip di mana Anda menempatkan kode ini) direktori tanpa trailing slash. ini penting jika Anda ingin menyertakan file lain dengan hasilnya
sumber
Jika Anda mencari jalur absolut relatif terhadap root server, saya telah menemukan bahwa ini berfungsi dengan baik:
sumber
Inilah fungsi PHP yang berguna yang saya tulis untuk ini dengan tepat. Saat pertanyaan awal mengklarifikasi, ia mengembalikan jalur dari mana skrip awal dieksekusi - bukan file tempat kita berada saat ini.
sumber
coba ini pada skrip Anda
sumber
Untuk skrip yang dijalankan di bawah server web
$_SERVER['SCRIPT_FILENAME']
akan berisi path lengkap ke skrip yang awalnya disebut, jadi mungkin index.php Anda.realpath()
tidak diperlukan dalam hal ini.Untuk skrip, jalankan dari konsol
$_SERVER['SCRIPT_FILENAME']
akan berisi jalur relatif ke skrip awalnya Anda dipanggil dari dir Anda saat ini bekerja. Jadi, kecuali Anda mengubah direktori kerja di dalam skrip Anda, itu akan menyelesaikan ke jalur absolut.sumber
Ini yang saya gunakan dan berfungsi di lingkungan Linux. Saya tidak berpikir ini akan bekerja pada mesin Windows ...
sumber
Cara mudah untuk memiliki jalan yang mutlak dari naskah awalnya dieksekusi , dalam naskah dan script lainnya termasuk dengan
include
,require
,require_once
adalah dengan menggunakan konstan dan menyimpan ada jalan naskah saat di awal dari script utama :Solusi di atas cocok ketika ada satu "utama" skrip yang
include
setiap skrip lain yang diperlukan, seperti di sebagian besar aplikasi web.Jika bukan itu masalahnya dan mungkin ada beberapa "skrip intital" maka untuk menghindari redefinisi dan agar jalur yang benar disimpan di dalam konstanta setiap skrip dapat dimulai dengan:
Catatan tentang jawaban yang saat ini diterima :
jawabannya menyatakan bahwa jalur skrip yang awalnya dijalankan adalah elemen pertama dari array yang dikembalikan oleh
get_included_files()
.Ini adalah solusi yang cerdas dan sederhana dan -pada saat penulisan- (kita hampir menggunakan PHP 7.4.0) itu berhasil .
Namun dengan melihat dokumentasi tidak disebutkan bahwa skrip yang awalnya dieksekusi adalah item pertama dari array yang dikembalikan oleh
get_included_files()
.Kami hanya membaca
Pada saat penulisan " skrip awalnya disebut " adalah yang pertama dalam array tetapi - secara teknis - tidak ada jaminan bahwa ini tidak akan berubah di masa depan.
Catatan tentang
realpath()
,__FILE__
dan__DIR__
:Lain telah disarankan dalam jawaban mereka penggunaan
__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
...dirname(__FILE__)
sama dengan__DIR__
(diperkenalkan dalam PHP 5.3.0), jadi gunakan saja__DIR__
.Keduanya
__FILE__
dan__DIR__
selalu jalur absolut sehinggarealpath()
tidak perlu.sumber