Ich habe hoch und niedrig gesucht und viele verschiedene Lösungen und Variablen mit Informationen erhalten, um den absoluten Pfad zu erhalten. Aber sie scheinen unter bestimmten Bedingungen zu funktionieren und unter anderen nicht. Gibt es eine Möglichkeit, den absoluten Pfad des ausgeführten Skripts in PHP zu ermitteln? Für mich wird das Skript über die Befehlszeile ausgeführt, aber eine Lösung sollte genauso gut funktionieren, wenn sie in Apache usw. ausgeführt wird.
Erläuterung: Das ursprünglich ausgeführte Skript, nicht unbedingt die Datei, in der die Lösung codiert ist.
Antworten:
Die richtige Lösung besteht darin, die
get_included_files
Funktion zu verwenden:Dies gibt Ihnen den absoluten Pfad des ursprünglichen Skripts, auch wenn:
Hier sind zwei Testskripte; das Hauptskript und eine enthaltene Datei:
Und das Ergebnis; Beachten Sie das aktuelle Verzeichnis:
quelle
get_included_files()
. Ich schlage vor ,__FILE__
am Anfang des Skripts eine Konstante zu speichern , die ursprünglich ausgeführt werden soll.__FILE__
Konstante gibt Ihnen den absoluten Pfad zur aktuellen Datei.Update :
Die Frage wurde geändert, um zu fragen, wie das ursprünglich ausgeführte Skript anstelle des aktuell ausgeführten Skripts abgerufen werden kann. Der einzige (??) zuverlässige Weg, dies zu tun, ist die Verwendung der
debug_backtrace
Funktion.quelle
__FILE__
der Speicherort der index.php oder der Speicherort der enthaltenen Datei zurückgegeben? Wie würde ich den Speicherort der index.php ermitteln?__FILE__
zeigt auf den Pfad des aktuellen Skripts. Aber ich habe nichts gefunden, was den Pfad der aktuellen index.php anzeigt.Die Antwort wurde hierher verschoben - https://stackoverflow.com/a/26944636/2377343
quelle
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
Wenn Sie dies in eine eingeschlossene Datei einfügen, wird der Pfad zu diesem Include gedruckt. Ersetzen Sie
__FILE__
durch, um den Pfad des übergeordneten Skripts abzurufen$_SERVER['PHP_SELF']
. Beachten Sie jedoch, dass PHP_SELF ein Sicherheitsrisiko darstellt!quelle
__FILE__
enthält es immer einen absoluten Pfad mit aufgelösten Symlinks, während es in älteren Versionen unter bestimmten Umständen einen relativen Pfad enthielt." plus "dirname () arbeitet naiv mit der Eingabezeichenfolge und kennt weder das eigentliche Dateisystem noch Pfadkomponenten wie '..'.PHP_SELF
?Aus dem Handbuch :
Hinweis :
__DIR__
wurde in PHP 5.3.0 hinzugefügt.quelle
Wenn Sie das aktuelle Arbeitsverzeichnis erhalten möchten, verwenden Sie
getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
gibt den Pfad mit dem Dateinamen beispielsweise auf XAMPPC:\xampp\htdocs\index.php
anstelle von zurückC:\xampp\htdocs\
quelle
gibt die absolute Route der aktuellen Datei an, von der Sie die Route anfordern, die Route Ihres Serververzeichnisses.
Beispieldateien:
www / http / html / index.php; Wenn Sie diesen Code in Ihre index.php einfügen, wird Folgendes zurückgegeben:
<?php echo dirname(__FILE__); // this will return: www/http/html/
www / http / html / class / myclass.php; Wenn Sie diesen Code in Ihre myclass.php einfügen, wird Folgendes zurückgegeben:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
quelle
Verwenden Sie einfach unten:
quelle
a.php->b.php->c.php
sollte also der Pfad von a.php sein, wenn er in c.php aktiviert ist . Der einzige Weg, der zuverlässig zu sein scheint, ist die Verwendung der Funktion debug_backtrace () .Es gibt Ihnen das aktuelle Skriptverzeichnis (das Skript, in das Sie diesen Code eingefügt haben) ohne abschließenden Schrägstrich. Dies ist wichtig, wenn Sie andere Dateien in das Ergebnis aufnehmen möchten
quelle
Wenn Sie nach dem absoluten Pfad relativ zum Serverstamm suchen, habe ich festgestellt, dass dies gut funktioniert:
quelle
Hier ist eine nützliche PHP-Funktion, die ich genau dafür geschrieben habe. Wie die ursprüngliche Frage klarstellt, gibt sie den Pfad zurück, von dem aus das ursprüngliche Skript ausgeführt wurde - nicht die Datei, in der wir uns gerade befinden.
quelle
Versuchen Sie dies in Ihrem Skript
quelle
Für Skripte, die unter einem Webserver ausgeführt
$_SERVER['SCRIPT_FILENAME']
werden, enthält der vollständige Pfad zum ursprünglich aufgerufenen Skript, also wahrscheinlich Ihre index.php.realpath()
ist in diesem Fall nicht erforderlich.Das Skript, das von der Konsole ausgeführt
$_SERVER['SCRIPT_FILENAME']
wird, enthält einen relativen Pfad zu Ihrem ursprünglich aufgerufenen Skript aus Ihrem aktuellen Arbeitsverzeichnis. Wenn Sie also das Arbeitsverzeichnis in Ihrem Skript nicht geändert haben, wird es in den absoluten Pfad aufgelöst.quelle
Dies ist, was ich benutze und es funktioniert in Linux-Umgebungen. Ich glaube nicht, dass dies auf einem Windows-Computer funktionieren würde ...
quelle
Ein einfacher Weg , um den absoluten Pfad des haben anfänglich ausgeführte Skript , in dem Skript und jeder anderen Skript enthielt mit
include
,require
,require_once
ist durch Verwendung eines konstanten und da den aktuellen Skript Pfades Speicherung des am Anfang Hauptskript :Die obige Lösung ist geeignet, wenn es ein einziges "Hauptskript" gibt, das
include
jedes andere benötigte Skript enthält, wie in den meisten Webanwendungen.Wenn dies nicht der Fall ist und es möglicherweise mehrere "Intital-Skripte" gibt, kann jedes Skript beginnen, um Neudefinitionen zu vermeiden und den richtigen Pfad in der Konstante zu speichern:
Ein Hinweis zur (derzeit) akzeptierten Antwort :
Die Antwort besagt, dass der ursprünglich ausgeführte Skriptpfad das erste Element des von zurückgegebenen Arrays ist
get_included_files()
.Dies ist eine clevere und einfache Lösung, die zum Zeitpunkt des Schreibens (wir sind fast bei PHP 7.4.0) funktioniert .
In der Dokumentation wird jedoch nicht erwähnt, dass das ursprünglich ausgeführte Skript das erste Element des von zurückgegebenen Arrays ist
get_included_files()
.Wir lesen nur
Zum Zeitpunkt des Schreibens ist das " ursprünglich aufgerufene Skript " das erste im Array, aber technisch gesehen gibt es keine Garantie dafür, dass sich dies in Zukunft nicht ändern wird.
Ein Hinweis zu
realpath()
,__FILE__
und__DIR__
:Andere haben in ihren Antworten die Verwendung vorgeschlagen
__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
...dirname(__FILE__)
ist gleich__DIR__
(eingeführt in PHP 5.3.0), also einfach verwenden__DIR__
.Beide
__FILE__
und__DIR__
sind immer absolute Pfade ,realpath()
ist also unnötig.quelle