Получить абсолютный путь текущего скрипта - PullRequest
233 голосов
/ 10 января 2011

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

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

Ответы [ 15 ]

3 голосов
/ 17 августа 2016

Вот полезная функция 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;
}
2 голосов
/ 02 июля 2018

Это то, что я использую, и оно работает в среде 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']);
}
1 голос
/ 09 января 2018

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

define( 'SCRIPT_ROOT', __FILE__ );

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

Уточнение: исходный исполняемый сценарий, а не файлв настоящее время

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


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

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

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}
1 голос
/ 09 сентября 2016
realpath($_SERVER['SCRIPT_FILENAME'])

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

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

1 голос
/ 24 марта 2016

попробуйте это в вашем скрипте

echo getcwd() . "\n";
...