Saya telah mencari tinggi dan rendah dan mendapatkan banyak solusi yang berbeda dan variabel yang berisi info untuk mendapatkan path absolut. Tapi mereka tampaknya untuk bekerja di bawah beberapa kondisi dan tidak berada di bawah orang lain. Ada satu peluru perak cara untuk mendapatkan path absolut dari skrip dijalankan di PHP? Bagi saya, script akan dijalankan dari baris perintah, namun, solusi yang harus berfungsi dengan baik jika dalam menjalankan Apache dll.
Klarifikasi: awalnya dijalankan script, belum tentu file mana solusi dikodekan.
__FILE__
konstan akan memberikan anda absolute path ke file saat ini.
Update:
Pertanyaan itu berubah untuk bertanya bagaimana untuk mengambil awalnya dijalankan script, bukan saat ini menjalankan script. Satu-satunya (??) terpercaya cara untuk melakukannya adalah dengan menggunakan debug_backtrace
fungsi.
$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
Contoh: https://(www.)example.com/subFolder/myfile.php?var=blabla#555
// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname'] 🡺 https://example.com/subFolder
$x['basename'] 🡺 myfile.php?
$x['extension'] 🡺 php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts
$x['filename'] 🡺 myfile
// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme'] 🡺 https
$x['host'] 🡺 example.com
$x['path'] 🡺 /subFolder/myfile.php
$x['query'] 🡺 k=blaa
$x['fragment'] 🡺 12345 // ! read my notice about hashtag parts
//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"] 🡺 /home/user/public_html
$_SERVER["SERVER_ADDR"] 🡺 143.34.112.23
$_SERVER["SERVER_PORT"] 🡺 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] 🡺 https //similar: $_SERVER["SERVER_PROTOCOL"]
$_SERVER['HTTP_HOST'] 🡺 example.com (or with WWW) //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"] 🡺 /subFolder/myfile.php?k=blaa
$_SERVER["QUERY_STRING"] 🡺 k=blaa
__FILE__ 🡺 /home/user/public_html/subFolder/myfile.php
__DIR__ 🡺 /home/user/public_html/subFolder //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"] 🡺 /subFolder/myfile.php?k=blaa
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺 /subFolder/myfile.php
$_SERVER["PHP_SELF"] 🡺 /subFolder/myfile.php
// ==================================================================//
//if "myfile.php" is included in "PARENTFILE.php" , and you visit "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]🡺 /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"] 🡺 /parentfile.php
$_SERVER["REQUEST_URI"] 🡺 /parentfile.php?abc
__FILE__ 🡺 /home/user/public_html/subFolder/myfile.php
// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' ); //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO']) ...
//To trim values to filename, i.e.
basename($url) 🡺 myfile.php
//excellent solution to find origin
$debug_files = debug_backtrace();
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;
Pemberitahuan!:
DIRECTORY_SEPARATOR
kembali \
untuk Windows-jenis hosting, bukan /
.//(let's say, if wordpress is installed in subdirectory: http://example.com/wpdir/)
home_url() 🡺 http://example.com/wpdir/ //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri() 🡺 http://example.com/wpdir/wp-content/themes/THEME_NAME [same: get_bloginfo('template_url') ]
get_stylesheet_directory() 🡺 /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__) 🡺 http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__) 🡺 /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/
echo realpath(dirname(__FILE__));
Jika anda menempatkan ini dalam sebuah file yang disertakan, cetakan jalan ini mencakup. Untuk mendapatkan path dari orang tua script, ganti __FILE__
dengan $_SERVER['PHP_SELF']
. Tapi diketahui bahwa PHP_SELF adalah risiko keamanan!
__DIR__
Dari manual:
Direktori file. Jika digunakan dalam aplikasi seperti, direktori termasuk file yang dikembalikan. Ini setara dengan dirname(__FILE__)
. Ini nama direktori yang tidak memiliki garis miring kecuali itu adalah direktori root.
__FILE__
selalu berisi path absolut dengan symlink diselesaikan sedangkan di versi yang lebih tua (dari 4.0.2) itu berisi path relatif di bawah beberapa keadaan.
Catatan: __DIR__
ditambahkan di PHP 5.3.0.
Solusi yang tepat adalah dengan menggunakan get_included_files
fungsi:
list($scriptPath) = get_included_files();
Ini akan memberi anda absolute path dari awal script bahkan jika:
Berikut ini adalah dua tes script; utama script dan file yang disertakan:
# C:\Users\Redacted\Desktop\main.php
include __DIR__ . DIRECTORY_SEPARATOR . 'include.php';
echoScriptPath();
# C:\Users\Redacted\Desktop\include.php
function echoScriptPath() {
list($scriptPath) = get_included_files();
echo 'The script being executed is ' . $scriptPath;
}
Dan hasilnya; melihat direktori saat ini:
C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
Jika anda ingin mendapatkan direktori kerja saat ini gunakan getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
akan kembali jalan dengan nama file misalnya pada XAMPP C:\xampp\htdocs\index.php
bukannya C:\xampp\htdocs\
dirname(__FILE__)
akan memberikan mutlak rute saat file yang anda menuntut rute, rute dari direktori server.
contoh file :
www/http/html/index.php ; jika anda menempatkan kode ini di dalam anda index.php itu akan kembali:
<?php echo dirname(__FILE__); // ini akan mengembalikan: www/http/html/
www/http/html/class/myclass.php ; jika anda menempatkan kode ini di dalam anda myclass.php itu akan kembali:
<?php echo dirname(__FILE__); // ini akan mengembalikan: www/http/html/kelas/
Berikut ini's yang berguna fungsi PHP yang saya tulis ini tepat. Sebagai pertanyaan awal menjelaskan, ia mengembalikan path yang awal script dieksekusi - file kita saat ini.
/**
* Get the file path/dir from which a script/function was initially executed
*
* @param bool $include_filename include/exclude filename in the return string
* @return string
*/
function get_function_origin_path($include_filename = true) {
$bt = debug_backtrace();
array_shift($bt);
if ( array_key_exists(0, $bt) && array_key_exists('file', $bt[0]) ) {
$file_path = $bt[0]['file'];
if ( $include_filename === false ) {
$file_path = str_replace(basename($file_path), '', $file_path);
}
} else {
$file_path = null;
}
return $file_path;
}
Ini adalah apa yang saya gunakan dan bekerja di lingkungan Linux. Saya don't pikir ini akan bekerja pada mesin Windows...
//define canonicalized absolute pathname for the script
if(substr($_SERVER['SCRIPT_NAME'],0,1) == DIRECTORY_SEPARATOR) {
//does the script name start with the directory separator?
//if so, the path is defined from root; may have symbolic references so still use realpath()
$script = realpath($_SERVER['SCRIPT_NAME']);
} else {
//otherwise prefix script name with the current working directory
//and use realpath() to resolve symbolic references
$script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME']);
}
Cara termudah untuk mengambil nilai absolut dari awalnya dijalankan script dari yang "main" script dan script yang disertakan dengan termasuk
, require
, require_once
adalah dengan menyimpannya di tempat yang konstan pada awal script utama:
define( 'SCRIPT_ROOT', __FILE__ );
__FILE__
kembali jalur script saat ini. Digunakan dalam aplikasi yang disertakan script pengembalian path dari file yang disertakan, bukan script awalnya berjalan sebagai OP bertanya:
Klarifikasi: awal skrip dijalankan, bukan file yang kita sedang di
Solusi menyimpan __FILE__
menjadi konstan lebih mudah dan lebih cepat daripada mengambil jalan menggunakan debug_backtrace()
Solusi di atas adalah cocok ketika ada satu "main" script yang `meliputi setiap lain yang dibutuhkan script, seperti di sebagian besar aplikasi web.
Jika itu's tidak terjadi dan mungkin ada beberapa "intital script" maka untuk menghindari redefinitions dan memiliki jalur yang benar disimpan dalam konstanta masing-masing script dapat dimulai dengan:
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}
realpath($_SERVER['SCRIPT_FILENAME'])
Untuk script yang berjalan di bawah web server $_SERVER['SCRIPT_FILENAME']
akan berisi path lengkap ke awalnya disebut script, jadi mungkin anda index.php. realpath()
tidak diperlukan dalam kasus ini.
Untuk menjalankan script dari konsol $_SERVER['SCRIPT_FILENAME']
akan berisi path relatif ke awalnya disebut script dari anda saat ini bekerja dir. Jadi kecuali jika anda mengubah direktori kerja dalam script ini akan menyelesaikan untuk path absolut.