Получить абсолютный путь к текущему скрипту

Я искал высоко и низко и получал множество различных решений и переменных, содержащих информацию, чтобы получить абсолютный путь. Но они, похоже, работают при некоторых условиях, а не под другими. Есть ли один серебряный пуля, чтобы получить абсолютный путь исполняемого скрипта в PHP? Для меня сценарий будет запускаться из командной строки, но решение должно функционировать точно также, если оно выполняется в Apache и т. Д.

Уточнение: первоначально выполненный скрипт, не обязательно файл, в котором кодируется решение.

php,path,include,

210

Ответов: 16


7 принят

Правильное решение - использовать функцию:list($scriptPath) = get_included_files();

# C:UsersRedactedDesktopmain.php
include __DIR__ . DIRECTORY_SEPARATOR . 'include.php';
echoScriptPath();

# C:UsersRedactedDesktopinclude.php
function echoScriptPath() {
    list($scriptPath) = get_included_files();
    echo 'The script being executed is ' . $scriptPath;
}

Это даст вам абсолютный путь исходного скрипта, даже если:

  • Эта функция помещается внутри включенного файла
  • Текущий рабочий каталог отличается от исходного каталога скрипта
  • Сценарий выполняется с CLI, как относительный путь

Вот два тестовых сценария; основной скрипт и прилагаемый файл:

C:>php C:UsersRedactedDesktopmain.php
The script being executed is C:UsersRedactedDesktopmain.php

И результат; обратите внимание на текущий каталог:

__FILE__

debug_backtrace константа даст вам абсолютный путь к текущему файлу.

Обновление :

Вопрос был изменен, чтобы спросить, как извлечь первоначально выполненный скрипт вместо текущего скрипта. Единственный (??) надежный способ сделать это - использовать функцию.$stack = debug_backtrace(); $firstFrame = $stack[count($stack) - 1]; $initialFile = $firstFrame['file'];

echo realpath(dirname(__FILE__));

__FILE__

Если вы разместите его во включенном файле, он напечатает путь к этому включению. Чтобы получить путь к родительскому скрипту, замените его $_SERVER['PHP_SELF']на https://(www.)example.com/subFolder/yourfile.php?var=blabla#555. Но имейте в виду, что PHP_SELF - это риск для безопасности!


Примеры для: //parse_url $x = parse_url($url); $x['scheme'] ?? https $x['host'] ?? example.com $x['path'] ?? /subFolder/yourfile.php $x['query'] ?? var=blabla $x['fragment'] ?? 555 // 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) A = pathinfo($url); B = pathinfo(parse_url($url)['path']); A['dirname'] ?? https://example.com/subFolder B['dirname'] ?? /subFolder A['basename'] ?? yourfile.php?var=blabla#555 B['basename'] ?? yourfile.php A['extension'] ?? php?var=blabla#555 B['extension'] ?? php A['filename'] ?? yourfile B['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 //like: $_SERVER["SERVER_PROTOCOL"] $_SERVER['HTTP_HOST'] ?? example.com //like: $_SERVER["SERVER_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 //like: 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, i.e. 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__;

типичные коды PHP:

DIRECTORY_SEPARATOR

Обратите внимание !:

  • hashtag (# ...) URL-адреса не могут быть обнаружены с PHP (на стороне сервера). Для этого используйте JavaScript.
  • возвращается /вместо хоста Windows-типа /.



Для WordPress

//(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__). Это имя каталога не имеет завершающей косой черты, если это не корневая директория.

PHP, путь, включают в себя,
Похожие вопросы