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

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

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

 mathheadinclouds12 нояб. 2014 г., 15:55
«Принятый ответ» означает «текущий скрипт, в котором вы находитесь (например, classFoo.php или myInclude.php)» НЕ «Исполняемый скрипт (например, index.php или startMyApp.php)», поэтому «разъяснение» вводит в заблуждение на 100%. Downvote для ОП.
 inquam13 нояб. 2014 г., 13:45
правда, математические облака Я принял это давным-давно, когда у меня был только один сценарий, и он работал для меня. Я удалил принятый ответ, чтобы понять, что это не решает начальную проблему. Сохранение константы FILE при запуске в скрипте - один из способов, но далеко не идеальный.

Ответы на вопрос(16)

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

echo __DIR__;
 inquam05 нояб. 2015 г., 15:30
Извините, идея в том, чтобы получить первый запущенный сценарий ... Не тот, в котором вы оказались. Итак, дерево включенияa.php->b.php->c.php должен быть путьa.php если зарегистрированc.php, Единственный надежный способ - использоватьdebug_backtrace () функция.

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

я обнаружил, что это работает хорошо:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
 Bronek29 дек. 2016 г., 22:07
Когда я проверял это решение на разных серверах, оно всегда указывало мне путь к linux, как к разделителям dir, независимо от ОС хоста (Windows и Linux). Для меня это преимущество.

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

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

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

__DIR__

руководство:

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

Запись: __DIR__ был добавлен в PHP 5.3.0.

 Andrew05 авг. 2016 г., 14:36
да, это лучший способ

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

Обновить:

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

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
 zerkms20 авг. 2018 г., 04:33
@ChristofferBubach вам даже не нужно его бросать: объект исключения собирает трассировку стека во время построения.
 CMCDragonkai16 нояб. 2013 г., 01:36
Что ж__FILE__ указывает на путь текущего скрипта. Но я не нашел ничего, чтобы показать текущий путь index.php.
 Mark Richards22 июл. 2014 г., 16:50
ВНИМАНИЕ: если сценарий находится в виртуальном каталоге apache2, возвращаемая информация НЕ обеспечивает реальное расположение пути на физическом сервере. Я хотел это в целях отладки, и даже переменные $ _SERVER не предоставляют этого. Например, если index.php существует в / var / www / vpath1 / html и / var / www / html / и / var / www / vpath2 / html, и каждый из них фактически сопоставлен с / var / www / html, тогда / var / www / html - это то, что вы увидите, независимо от того, какой виртуальный сервер используется.
 CMCDragonkai16 нояб. 2013 г., 00:55
Если я использую шаблон фронт-контроллера. Было бы__FILE__ вернуть местоположение index.php или местоположение включенного файла? Как бы я получить местоположение index.php?
 zerkms16 нояб. 2013 г., 05:46
@CMCDragonkai: задайте отдельный вопрос

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

/**
 * 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;
}
Решение Вопроса

Правильным решением является использование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

Примеры для:https://(www.)example.com/subFolder/yourfile.php?var=blabla#555

//=================================================== 
//========== 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




// ===================================================
// ============== PARSE_URL & PATHINFO ==============
// ===================================================
//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





// ===================================================
// ================= 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();       
$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/  
 Salem03 июл. 2016 г., 05:36
получить текущую папку скриптаstr_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
 Sean the Bean05 мар. 2018 г., 15:44
Это, безусловно, самый полный список примеров способов получения части или всего пути к файлу, который я видел во всем Интернете.

поэтому я нашел решение для этого. Код:

echo dirname(__FILE__).'\\'.basename(__FILE__);

Он должен дать абсолютный путь, включая имя файла.

 Tino10 мар. 2018 г., 12:59
Downvoted! Первое: это, видимо, только Windows. Второе: если я заменю `\\` на/, на моей стороне это выводит точно так же, как__FILE__ (под Linux__FILE__ кажется всегда абсолютным). Третье: более важно при запуске из командной строки (php -r "$(cat script)" что очень законно),выводит полный мусор, возможноecho realpath(__FILE__); было бы хорошо, так как вы можете использовать его, как вif (realpath(__FILE__)!=__FILE__) { running_from_commandline(); } чтобы обнаружить командную строку, однакоесть лучший способ сделать это
 Tino10 мар. 2018 г., 13:07
Должен прочестьif (realpath(__FILE__)==""} { running_from_commandline(); } (но я больше не могу редактировать комментарий)

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

echo getcwd() . "\n";
 webeno24 мар. 2016 г., 12:10
этот ответ уже был предоставлен:stackoverflow.com/a/25803880/2037924
realpath($_SERVER['SCRIPT_FILENAME'])

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

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

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

define( 'SCRIPT_ROOT', __FILE__ );

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

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

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

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

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

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}
echo realpath(dirname(__FILE__));

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

 Your Common Sense10 янв. 2011 г., 10:52
о, 4.0.2. Прошлый век?
 Your Common Sense10 янв. 2011 г., 10:09
какая польза от realpath здесь?
 zerkms10 янв. 2011 г., 10:53
@rik: также, что может вызвать проблема безопасностиPHP_SELF ??
 rik10 янв. 2011 г., 10:49
@Col. Шрапнель: «Начиная с PHP 4.0.2,__FILE__ всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях он содержал относительный путь при некоторых обстоятельствах. «plus» dirname () наивно работает с входной строкой и не знает о фактической файловой системе или компонентах пути, таких как '.. ».
 zerkms10 янв. 2011 г., 10:51
@rik: так вы верите, что кто-нибудь использует php <4.0.2 ???
`realpath(dirname(__FILE__))` 

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

 inquam25 февр. 2015 г., 15:47
Да, но идея в том, чтобы иметь возможность получить абсолютный путь к «сценарию обстрела» A.php даже внутри B.php, если он включен в A.php. Конечно, это можно сделать, сохранив исходный скрипт для последующего доступа, но вопрос был в том, возможно ли получить его без этого.
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/

Ваш ответ на вопрос