Szukałem wysoko i nisko i otrzymałem wiele różnych rozwiązań i zmiennych zawierających informacje, aby uzyskać absolutną ścieżkę. Ale wydają się działać pod pewnymi warunkami, a nie pod innymi. Czy istnieje jeden srebrny sposób, aby uzyskać bezwzględną ścieżkę do wykonanego skryptu w PHP? Dla mnie skrypt będzie działał z wiersza poleceń, ale rozwiązanie powinno działać równie dobrze, jeśli działa w Apache itp.
Wyjaśnienie: Początkowo wykonany skrypt, niekoniecznie plik, w którym kodowane jest rozwiązanie.
Odpowiedzi:
Prawidłowym rozwiązaniem jest użycie
get_included_files
funkcji:To da ci bezwzględną ścieżkę początkowego skryptu, nawet jeśli:
Oto dwa skrypty testowe; główny skrypt i dołączony plik:
I wynik; zwróć uwagę na bieżący katalog:
źródło
get_included_files()
. I sugerują, do sklepu__FILE__
na stałym poziomie na początku skryptu ma być początkowo biec.__FILE__
stała da absolutną ścieżkę do bieżącego pliku.Aktualizacja :
Pytanie zostało zmienione, aby zapytać, jak odzyskać początkowo wykonany skrypt zamiast aktualnie działającego skryptu. Jedynym (??) niezawodnym sposobem na to jest użycie
debug_backtrace
funkcji.źródło
__FILE__
zwróci lokalizację pliku index.php lub lokalizację dołączonego pliku? Jak uzyskać lokalizację index.php?__FILE__
wskazuje na ścieżkę bieżącego skryptu. Ale nie znalazłem niczego, co pokazuje bieżącą ścieżkę index.php.Odpowiedź została przeniesiona tutaj - https://stackoverflow.com/a/26944636/2377343
źródło
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
Jeśli umieścisz to w dołączonym pliku, drukuje ścieżkę do tego dołączenia. Aby uzyskać ścieżkę skryptu dominującej, wymienić
__FILE__
z$_SERVER['PHP_SELF']
. Pamiętaj jednak, że PHP_SELF stanowi zagrożenie bezpieczeństwa!źródło
__FILE__
zawsze zawiera bezwzględną ścieżkę z rozwiązanymi dowiązaniami symbolicznymi, podczas gdy w starszych wersjach zawierała ścieżkę względną w pewnych okolicznościach.” plus "dirname () działa naiwnie na łańcuch wejściowy i nie jest świadomy rzeczywistego systemu plików ani składników ścieżki, takich jak„ .. ”.PHP_SELF
?Z instrukcji :
Uwaga :
__DIR__
dodano w PHP 5.3.0.źródło
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 na XAMPPC:\xampp\htdocs\index.php
zamiastC:\xampp\htdocs\
źródło
poda bezwzględną trasę bieżącego pliku, z którego żądasz trasy, trasę katalogu na serwerze.
przykładowe pliki:
www / http / html / index.php; jeśli umieścisz ten kod w pliku index.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 w pliku myclass.php, zwróci:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
źródło
Po prostu użyj poniżej:
źródło
a.php->b.php->c.php
powinna być ścieżka a.php jeśli sprawdzany w c.php . Jedynym sposobem, który wydaje się wiarygodny, jest użycie funkcji debug_backtrace () .daje ci aktualny katalog skryptu (skrypt, w którym umieściłeś ten kod), bez ukośnika. jest to ważne, jeśli chcesz dołączyć inne pliki z wynikiem
źródło
Jeśli szukasz ścieżki bezwzględnej względem katalogu głównego serwera, zauważyłem, że działa to dobrze:
źródło
Oto przydatna funkcja PHP, którą dokładnie dla tego napisałem. Jak wyjaśnia pierwotne pytanie, zwraca ścieżkę, z której wykonano skrypt początkowy - a nie plik, w którym obecnie się znajdujemy.
źródło
spróbuj tego na swoim skrypcie
źródło
Dla skryptu uruchamianego pod serwerem WWW
$_SERVER['SCRIPT_FILENAME']
będzie zawierać pełną ścieżkę do początkowo nazywanego skryptu, więc prawdopodobnie twój index.php.realpath()
nie jest wymagane w tym przypadku.Skrypt uruchamiany z konsoli
$_SERVER['SCRIPT_FILENAME']
będzie zawierał ścieżkę względną do początkowo wywoływanego skryptu z bieżącego katalogu roboczego. Więc jeśli nie zmienisz katalogu roboczego w skrypcie, rozwiąże on ścieżkę bezwzględną.źródło
Tego używam i działa w środowiskach Linux. Nie sądzę, aby działało to na komputerze z systemem Windows ...
źródło
Prostym sposobem, aby mieć absolutną ścieżkę początkowo wykonywanego skryptu , w tym skrypcie i każdego innego skryptu dołączona
include
,require
,require_once
jest za pomocą stałej i przechowywanie tam bieżącą ścieżkę skryptu na początku głównego skryptu :Powyższe rozwiązanie jest odpowiednie, gdy istnieje jeden „główny” skrypt, który
include
jest wszystkim innym potrzebnym skryptem, jak w większości aplikacji internetowych.Jeśli tak nie jest i może istnieć kilka „skryptów początkowych”, aby uniknąć redefinicji i mieć prawidłową ścieżkę przechowywaną w stałej, każdy skrypt może zaczynać się od:
Uwaga na temat (obecnie) akceptowanej odpowiedzi :
odpowiedź stwierdza, że początkowo wykonana ścieżka skryptu jest pierwszym elementem tablicy zwróconym przez
get_included_files()
.Jest to sprytne i proste rozwiązanie i - w momencie pisania - (jesteśmy prawie w PHP 7.4.0) działa .
Jednak patrząc na dokumentację nie ma wzmianki, że początkowo wykonany skrypt jest pierwszym elementem tablicy zwróconym przez
get_included_files()
.My tylko czytamy
W momencie pisania „ skrypt pierwotnie nazwany ” jest pierwszym w tablicy, ale - technicznie rzecz biorąc - nie ma gwarancji, że nie zmieni się to w przyszłości.
Uwaga na temat
realpath()
,__FILE__
oraz__DIR__
:Inni sugerowali w swoich odpowiedziach użycia
__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
...dirname(__FILE__)
jest równy__DIR__
(wprowadzony w PHP 5.3.0), więc po prostu użyj__DIR__
.Zarówno
__FILE__
i__DIR__
zawsze ścieżki bezwzględne więcrealpath()
nie jest konieczne.źródło