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

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

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

Комментарии к вопросу (2)

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

Обновить:

Вопрос был изменен, чтобы спросить, как получить изначально выполненный скрипт вместо текущего запущенного скрипта. Единственный (??) надежный способ сделать это - использовать функцию debug_backtrace.

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
Комментарии (16)

Примеры для: 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__;

Уведомление!:

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

& Лт; br / >


Для 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/  
Комментарии (2)
echo realpath(dirname(__FILE__));

Если вы поместите это в включенный файл, он распечатает путь к этому включению. Чтобы получить путь к родительскому сценарию, замените __FILE__ на $ _SERVER ['PHP_SELF']. Но имейте в виду, что PHP_SELF - это риск безопасности!

Комментарии (12)
__DIR__

Из руководства:

< blockquote > Каталог файла. При использовании внутри включения возвращается каталог включенного файла. Это эквивалентно dirname (__FILE__) < / code >. Это имя каталога не имеет конечной косой черты, если это не корневой каталог. < / blockquote > < blockquote > < b > __ FILE__ < / code > < / b > всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях (чем 4.0.2) он содержал относительный путь при некоторых обстоятельствах. < / blockquote >

Примечание : __DIR__ был добавлен в PHP 5.3.0.

Комментарии (1)
Решение

Правильное решение - использовать функцию get_included_files:

list($scriptPath) = get_included_files();

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

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

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

# 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;
}

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

C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
Комментарии (0)

Если вы хотите получить текущий рабочий каталог , используйте getcwd ()

< http://php.net/manual/en/function.getcwd.php>

__FILE__ вернет путь с именем файла, например, в XAMPP C: \ xampp \ htdocs \ index.php вместо C: \ xampp \ htdocs \

Комментарии (0)
dirname(__FILE__) 

даст abolute route текущего файла, из которого вы требуете маршрут, маршрут вашего каталога сервера.

пример файлов:

www / http / html / index.php; если вы поместите этот код в свой index.php, он вернет:

<?php echo dirname (__FILE__); // это вернется: www / http / html /

www / http / html / class / myclass.php; если вы поместите этот код в свой myclass.php, он вернет:

<?php echo dirname (__FILE__); // это вернется: www / http / html / class /

Комментарии (0)

Просто используйте ниже:

echo __DIR__;
Комментарии (1)
`realpath(dirname(__FILE__))` 

он дает вам текущий каталог script (скрипт, в который вы поместили этот код) без конечной косой черты. это важно, если вы хотите включить другие файлы с результатом

Комментарии (1)

Если вы ищете абсолютный путь относительно корня сервера, я обнаружил, что это работает хорошо:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
Комментарии (1)

Вот полезная функция PHP, которую я написал для этого точно. Как поясняется в первоначальном вопросе, он возвращает путь, с которого был выполнен сценарий initial , а не файл, в котором мы сейчас находимся.

/**
 * 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;
}
Комментарии (0)

Это то, что я использую, и это работает в средах Linux. Я не думаю, что это будет работать на компьютере с 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']);
}
Комментарии (0)

попробуйте это на своем сценарии

echo getcwd() . "\n";
Комментарии (1)

Самый простой способ получить абсолютный путь изначально выполненного скрипта из этого «основного» скрипта и любого скрипта, включенного в include, require, require_once, - это сохранить его в константе в начале основного скрипта: ,

define( 'SCRIPT_ROOT', __FILE__ );

__FILE__ возвращает путь текущего скрипта. Используемый внутри включенного скрипта возвращает путь к включенному файлу , а не скрипт, изначально запущенный, как запрашивает OP:

Разъяснение: начальный выполненный скрипт, а не файл, в котором мы находимся в данный момент

Решение о хранении __FILE__ в константе проще и быстрее, чем извлечение пути с помощью debug_backtrace ()


Вышеуказанное решение подходит, когда есть один «основной» скрипт, который «включает» любой другой необходимый скрипт, как в большинстве веб-приложений.

Если это не так и может быть несколько «внутренних скриптов», то, чтобы избежать переопределения и сохранить правильный путь внутри константы, каждый скрипт может начинаться с:

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}
Комментарии (0)
realpath($_SERVER['SCRIPT_FILENAME'])

Для скрипта, запущенного под веб-сервером $ _SERVER ['SCRIPT_FILENAME'], будет содержаться полный путь к первоначально называемому скрипту, поэтому, вероятно, ваш index.php. realpath () не требуется в этом случае.

Для скрипта, запускаемого с консоли $ _SERVER ['SCRIPT_FILENAME'], будет содержать относительный путь к вашему первоначально вызванному сценарию из вашего текущего рабочего реж. Поэтому, если вы не изменили рабочий каталог внутри своего скрипта, он перейдет к абсолютному пути.

Комментарии (0)