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.
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
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'];
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!
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/
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.
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\
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/
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__;
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'])
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
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.
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;
}
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";
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.
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__ );
}
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']);
}
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