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

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

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

Ответы [ 15 ]

260 голосов
/ 10 января 2011

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

Обновление

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

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
249 голосов
/ 04 июля 2013

Примеры для: 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 вместо /.


Для 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/  
236 голосов
/ 10 января 2011
echo realpath(dirname(__FILE__));

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

34 голосов
/ 01 апреля 2015
__DIR__

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

Каталог файла.Если используется внутри включения, возвращается каталог включенного файла.Это эквивалентно dirname(__FILE__).Это имя каталога не имеет косой черты, если только оно не является корневым каталогом.
__FILE__ всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях (чем 4.0.2) при некоторых обстоятельствах он содержал относительный путь

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

23 голосов
/ 01 марта 2018

Правильным решением является использование функции 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
20 голосов
/ 12 сентября 2014

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

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

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

7 голосов
/ 01 октября 2014
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/

6 голосов
/ 05 ноября 2015

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

echo __DIR__;
4 голосов
/ 25 февраля 2015
`realpath(dirname(__FILE__))` 

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

4 голосов
/ 20 августа 2014

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

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
...