Я искал высоко и низко и получал множество различных решений и varialbles, содержащих информацию, чтобы получить абсолютный путь. Но они, похоже, работают при некоторых условиях, а не под другими. Есть ли один серебряный пуля, чтобы получить абсолютный путь к текущему исполняемому скрипту в php? Для меня сценарий будет запущен из командной строки, но он должен работать так же хорошо, как и в apache и т. Д.
Уточнение: начальный исполняемый скрипт, а не тот файл, в котором мы сейчас находимся
__FILE__
даст вам абсолютный путь к текущему файлу.
UPD :
Как только вопрос был изменен для получения сценария, который инициировал среду выполнения, единственным (?) Надежным способом сделать это является использование функции debug_backtrace
.
$stack = debug_backtrace(); $firstFrame = $stack[count($stack) - 1]; $initialFile = $firstFrame['file'];
echo realpath(dirname(__FILE__));
Если вы разместите его во включенном файле, он напечатает путь к этому включению. Чтобы получить путь к родительскому скрипту, замените __FILE__
на $_SERVER['PHP_SELF']
. Но имейте в виду, что PHP_SELF – это риск для безопасности!
Примеры для: https://example.com/subFolder/yourfile.php?var=blabla#12345
//parse_url $x = parse_url($url); $x['scheme'] 🡺 https $x['host'] 🡺 example.com (or with WWW) $x['path'] 🡺 /subFolder/yourfile.php $x['query'] 🡺 var=blabla $x['fragment'] 🡺 12345 // hashtag outputed only in case, when hashtag-containing string was manually passed to function, otherwise PHP is unable to recognise hashtags in $_SERVER //pathinfo (If you will ever use this function, I only recommend to pass `parse_url`s output as argument) $x = pathinfo($url); $Y = pathinfo(parse_url($url)['path']); $x['dirname'] 🡺 https://example.com/subFolder $Y['dirname'] 🡺 /subFolder $x['basename'] 🡺 yourfile.php?var=blabla#12345 $Y['basename'] 🡺 yourfile.php $x['extension'] 🡺 php?var=blabla#12345 $Y['extension'] 🡺 php $x['filename'] 🡺 yourfile $Y['filename'] 🡺 yourfile //=================================================== // //========== 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/yourfile.php?var=blabla $_SERVER["QUERY_STRING"] 🡺 var=blabla __FILE__ 🡺 /home/user/public_html/subFolder/yourfile.php __DIR__ 🡺 /home/user/public_html/subFolder //same: dirname(__FILE__) $_SERVER["REQUEST_URI"] 🡺 /subFolder/yourfile.php?var=blabla parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺 /subFolder/yourfile.php $_SERVER["PHP_SELF"] 🡺 /subFolder/yourfile.php // ==================================================================// //if "YOURFILE.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/yourfile.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, ie basename($url) 🡺 yourfile.php //excellent solution to find origin $debug_files = debug_backtrace(); $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;
Обратите внимание !:
DIRECTORY_SEPARATOR
возвращает \
для хостов Windows-типа вместо /
. //(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/
__DIR__
Каталог файла. Если используется внутри include, возвращается каталог включенного файла. Это эквивалентно
dirname(__FILE__)
. Это имя каталога не имеет завершающей косой черты, если это не корневая директория.
getcwd()
– правильный ответ – http://php.net/manual/en/function.getcwd.php
__FILE__
вернет путь с именем файла, например, на XAMPP C:\xampp\htdocs\index.php
Вы хотите получить текущий рабочий каталог, поэтому используйте getcwd()
для получения C:\xampp\htdocs\
dirname(__FILE__)
даст абсолютный маршрут текущего файла, из которого вы требуете маршрут, маршрут вашего каталога сервера.
Примеры файлов:
www / http / html / index.php; если вы поместите этот код внутри вашего index.php, он вернется:
<?php echo dirname(__FILE__); // this will return: www/http/html/
www / http / html / class / myclass.php; если вы разместите этот код внутри myclass.php, он вернется:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
Просто используйте ниже:
echo __DIR__;
Если вы ищете абсолютный путь относительно корня сервера, я обнаружил, что это работает хорошо:
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
`realpath(dirname(__FILE__))`
он дает вам текущий скрипт (скрипт, внутри которого вы поместили этот код), без конечной косой черты. это важно, если вы хотите включить другие файлы с результатом
Вот полезная функция PHP, которую я написал для этого точно. По мере выяснения исходного вопроса он возвращает путь, из которого был выполнен исходный скрипт, а не тот файл, в котором мы сейчас находимся.
/** * 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; }
В случае использования фреймворка большинство из них не работает, поэтому я нашел решение для этого. Код:
echo dirname(__FILE__).'\\'.basename(__FILE__);
Он должен указывать абсолютный путь, включая имя файла.
realpath($_SERVER['SCRIPT_FILENAME'])
Для запуска сценария под веб-сервером $_SERVER['SCRIPT_FILENAME']
будет содержать полный путь к первоначально названному сценарию, поэтому, вероятно, ваш index.php. realpath()
в этом случае не требуется.
Для сценария, запускаемого с консоли $_SERVER['SCRIPT_FILENAME']
будет $_SERVER['SCRIPT_FILENAME']
относительный путь к вашему первоначально названному сценарию из текущего текущего каталога. Поэтому, если вы не изменили рабочий каталог внутри вашего скрипта, он решит абсолютный путь.
попробуйте это на своем скрипте
echo getcwd() . "\n";