Get absolute path of current script

Przeszukałem wysoko i nisko i uzyskałem wiele różnych rozwiązań i zmiennych zawierających informacje, aby uzyskać ścieżkę bezwzględną. Ale wydają się działać w pewnych warunkach, a nie w innych. Czy istnieje jeden sposób na uzyskanie bezwzględnej ścieżki wykonanego skryptu w PHP? Dla mnie skrypt będzie uruchamiany z linii poleceń, ale rozwiązanie powinno działać równie dobrze, jeśli jest uruchamiane w Apache itp.

Wyjaśnienie: początkowo wykonywany skrypt, niekoniecznie plik gdzie rozwiązanie jest zakodowane.

Author: kbulgrien, 2011-01-10

16 answers

Poprawnym rozwiązaniem jest użycie get_included_files Funkcja:

list($scriptPath) = get_included_files();

To da Ci absolutną ścieżkę początkowego skryptu, nawet jeśli:

  • Ta funkcja jest umieszczana wewnątrz dołączonego pliku
  • bieżący katalog roboczy różni się od katalogu początkowego skryptu
  • skrypt jest wykonywany z CLI, jako ścieżka względna

Oto dwa skrypty testowe; skrypt główny i dołączony plik:

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

I wynik; zwróć uwagę na bieżący katalog:

C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
 10
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-01 11:39:59

__FILE__ constant da Ci absolutną ścieżkę do bieżącego pliku.

Update :

Pytanie zostało zmienione, aby zapytać, Jak odzyskać pierwotnie wykonany skrypt zamiast aktualnie uruchomionego skryptu. Jedyny (??) niezawodnym sposobem na to jest użycie debug_backtrace funkcja.

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
 256
Author: zerkms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 15:36:59
echo realpath(dirname(__FILE__));

Jeśli umieścisz to w dołączonym pliku, wyświetli on ścieżkę do tego dołączonego pliku. Aby uzyskać ścieżkę skryptu nadrzędnego, zamień __FILE__ na $_SERVER['PHP_SELF']. Pamiętaj jednak, że PHP_SELF stanowi zagrożenie bezpieczeństwa!

 229
Author: rik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 09:14:05

Przykłady: https://(www.)example.com/subFolder/yourfile.php?var=blabla#555

Typowe kody PHP:

//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__;

Uwaga!:

  • hashtag (#...) Części URL nie mogą być wykryte z PHP (po stronie serwera). W tym celu użyj JavaScript.
  • DIRECTORY_SEPARATOR zwraca \ dla hostingu typu Windows, zamiast /.



Dla WordPressa

//(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/  
 226
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 15:46:56
__DIR__

Z instrukcji :

Katalog pliku. W przypadku użycia wewnątrz include zwracany jest katalog dołączonego pliku. Jest to równoważne dirname(__FILE__). Ta nazwa katalogu nie ma ukośnika końcowego, chyba że jest to katalog główny.
__FILE__ zawsze zawiera ścieżkę bezwzględną z rozwiązanymi dowiązaniami symbolicznymi, podczas gdy w starszych wersjach (niż 4.0.2) zawierała ścieżkę względną w pewnych okolicznościach.

Uwaga: __DIR__ dodano w PHP 5.3.0.

 33
Author: Gottlieb Notschnabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 01:24:56

Jeśli chcesz uzyskać bieżący katalog roboczy użyj getcwd()

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

__FILE__ zwróci ścieżkę z nazwą pliku na przykład w XAMPP C:\xampp\htdocs\index.php zamiast C:\xampp\htdocs\

 18
Author: pkarecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-06 03:20:26
dirname(__FILE__) 

Poda absolutną trasę bieżącego pliku, z którego żądasz trasy, trasę Twojego katalogu serwera.

Przykładowe pliki:

Www / http / html / index.php; jeśli umieścisz ten kod w indeksie.php zwróci:

<?php echo dirname(__FILE__); // this will return: www/http/html/

Www / http / html/class / myclass.php; jeśli umieścisz ten kod wewnątrz swojej myclass.php zwróci:

<?php echo dirname(__FILE__); // this will return: www/http/html/class/

 10
Author: Sultanos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 10:47:54

Po prostu użyj poniżej:

echo __DIR__;
 8
Author: Matricore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 12:40:54

Jeśli szukasz ścieżki bezwzględnej względem głównego serwera, odkryłem, że działa to dobrze:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
 7
Author: SiteKickr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 00:18:31
`realpath(dirname(__FILE__))` 

Daje ci bieżący skrypt (skrypt, w którym umieściłeś ten kod) katalog bez końcowego ukośnika. jest to ważne, jeśli chcesz dołączyć inne pliki z wynikiem

 6
Author: minhajul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 14:44:33

W przypadku używania frameworka większość z nich nie działa, więc znalazłem na to rozwiązanie. Kod:

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

Powinien podać ścieżkę bezwzględną, w tym nazwę pliku.

 6
Author: user7364363,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 08:06:47

Oto przydatna funkcja PHP, którą napisałem do tego właśnie. Jak wyjaśnia pierwotne pytanie, zwraca drogę, z której początkowe skrypt został wykonany - Nie plik, w którym aktualnie się znajdujemy.

/**
 * 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;
}
 4
Author: blizzrdof77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 17:42:45

Wypróbuj to na swoim skrypcie

echo getcwd() . "\n";
 2
Author: Shuhad zaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 10:25:42
realpath($_SERVER['SCRIPT_FILENAME'])

Skrypt uruchamiany pod serwerem WWW $_SERVER['SCRIPT_FILENAME'] będzie zawierał pełną ścieżkę do pierwotnie nazwanego skryptu, więc prawdopodobnie Twój indeks.php. {[2] } nie jest wymagane w tym przypadku.

Skrypt uruchamiany z konsoli $_SERVER['SCRIPT_FILENAME'] będzie zawierał względną ścieżkę do pierwotnie wywołanego skryptu z bieżącego katalogu roboczego. Więc jeśli nie zmienisz katalogu roboczego wewnątrz skryptu, zostanie on rozwiązany do ścieżki bezwzględnej.

 2
Author: Victor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:47:50

Najprostszy sposób na pobranie bezwzględnej ścieżki pierwotnie wykonanego skryptu z tego" głównego " skryptu i dowolnego skryptu dołączonego do include, require, require_once jest przez zapisanie go w stałej na początku głównego skryptu:

define( 'SCRIPT_ROOT', __FILE__ );

__FILE__ zwraca ścieżkę bieżącego skryptu. Użyty wewnątrz dołączonego skryptu zwraca ścieżkę dołączonego pliku, a nie skrypt początkowo uruchamiany, gdy op pyta:

Wyjaśnienie: początkowy wykonywany skrypt, a nie plik, w którym aktualnie znajdujemy się

Rozwiązanie zapisu __FILE__ do stałej jest łatwiejsze i szybsze niż pobieranie ścieżki za pomocą debug_backtrace()


Powyższe rozwiązanie jest odpowiednie, gdy istnieje jeden "główny" skrypt, który include Jest każdym innym potrzebnym skryptem, jak w większości aplikacji internetowych.

Jeśli tak nie jest i może być kilka "skryptów wewnętrznych", to aby uniknąć redefinicji i mieć prawidłową ścieżkę zapisaną wewnątrz stałej, każdy skrypt może się rozpocząć z:

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}
 1
Author: Paolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 12:10:02

To jest to, czego używam i działa w środowiskach Linuksowych. Nie sądzę, aby to działało na komputerze z systemem 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
Author: andrewniesen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-02 02:33:19