Stammverzeichnispfad eines PHP-Projekts abrufen

115

Ich habe diese Ordnerstruktur in meinem PHP-Projekt. (Dies ist wie in Finsternissen gezeigt)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

Wenn ich diesen Code versuche

echo $_SERVER['DOCUMENT_ROOT']

Ausgabe ist

D: / Arbeitsbereich

Wie kann ich den Pfad zu RootDirectory des Systems ( MySystem) abrufen, ohne den Ordnernamen fest zu codieren?

Nalaka526
quelle

Antworten:

146

Für PHP> = 5.3.0 versuchen

PHP magische Konstanten .

__DIR__

Und machen Sie Ihren Weg relativ.

Für PHP <5.3.0 versuchen

dirname(__FILE__)
Prasad Rajapaksha
quelle
3
Das ist einfach großartig. Ich habe $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] usw. ausprobiert, aber das hat hervorragend funktioniert!
Webblover
77
Es hängt davon ab, wo Sie verwenden __DIR__ . Es ist relativ zur Datei selbst. Wenn sich also in einem Include in einem Unterverzeichnis befindet, wird nicht nur Ihr Stammverzeichnis zurückgegeben.
Iris
10
Es wird kein Stammverzeichnis geben
inrsaurabh
1
Kurznotiz für alle, die über diese Antwort stolpern und nach der Antwort auf die gestellte Frage suchen. DIR erhält das Verzeichnis der aktuellen Datei, nicht das Projektstammverzeichnis, es sei denn, Sie rufen es in einer Datei auf, die sich im Projektstammverzeichnis befindet, aber wie PHP nicht Haben Sie das Konzept eines Projekts
?
Bitte stimmen Sie einer Antwort nicht zu, die die Frage nicht richtig anspricht, nur weil sie Ihnen geholfen hat.
ElYeante
73

Wenn du das sagst

$_SERVER['DOCUMENT_ROOT']

enthält diesen Pfad:

D:/workspace

Dann D:ist es das, wonach Sie suchen, nicht wahr? In diesem Fall können Sie die Zeichenfolge durch Schrägstriche auflösen und die erste zurückgeben:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

Dadurch wird das Stammverzeichnis des Servers ausgegeben.

Update: Wenn Sie die Konstante DIRECTORY_SEPARATORanstelle des fest codierten Schrägstrichs ( '/') verwenden, funktioniert dieser Code auch unter Windows.

Update 2: Die $_SERVERglobale Variable ist nicht immer verfügbar. Zum Beispiel in der Kommandozeile (cli). Also solltest du __DIR__statt verwenden $_SERVER['DOCUMENT_ROOT']. __DIR__Gibt den Pfad der PHP-Datei selbst zurück.

Armin
quelle
2
Und Sie könnten __DIR__anstelle von verwenden $_SERVER['DOCUMENT_ROOT'].
Armin
Entschuldigung Wenn ich meine Frage nicht richtig erklärt habe, brauche ich eigentlich 'D: / workspace / MySystem'
Nalaka526
1
Wenn Ihr Stammverzeichnispfad die Form / var / public / www hat, ist bei dieser Methode die erste Zeichenfolge im Array leer (0) / (1) / (2) / (3). Das Stammverzeichnis ist leer die zweite Zeichenfolge $ pathInPieces [1]
tbradley22
36

Verwenden Sie die PHP-Funktion:

getcwd()

Ruft das aktuelle Arbeitsverzeichnis ab.

dkinzer
quelle
1
Dies gibt CURRENT zurück, der den Dateipfad ausführt. Nicht
Wurzelpfad
9

Ich möchte darauf hinweisen, wie Wordpress damit umgeht:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

Da Wordpress im gesamten Web sehr häufig verwendet wird und auch lokal einwandfrei funktioniert, habe ich großes Vertrauen in diese Methode.

Hexodus
quelle
1
Ich denke, das funktioniert nur, wenn Sie zwei Ebenen von Verzeichnissen haben. Richtig? Ich meine, wenn es aus base_project_directory / folder1 / folder2 / folder3 / file.php aufgerufen wird, wird das base_project_directory nicht zurückgegeben.
Ali Khalili
"Da Wordpress im gesamten Web sehr häufig verwendet wird und auch lokal einwandfrei funktioniert, habe ich großes Vertrauen in diese Methode." Ich glaube nicht, dass dies angesichts der WP-Codequalität und der Sicherheitsbilanz ein besonders gutes Argument ist.
Alex Barker
1
@AlexBarker Ich würde die Tatsache bestreiten, dass Sie implizieren, dass WP eine schlechte Sicherheitsbilanz hat. Es ist eigentlich ziemlich sicher und hat ein reaktionsschnelles Team, das sich auf Sicherheit konzentriert - Core hatte in den letzten Jahren nur sehr wenige ausgenutzte Sicherheitsprobleme (auch nicht, als Sie dies kommentierten).
William Patton
3

Du kannst es versuchen: $_SERVER['PATH_TRANSLATED']

Zitat:

Dateisystem- (nicht Dokumentenstamm-) basierter Pfad zum aktuellen Skript, nachdem der Server eine Zuordnung von virtuell zu real vorgenommen hat. Hinweis: Ab PHP 4.3.2 wird PATH_TRANSLATEDes unter Apache 2 SAPI nicht mehr implizit festgelegt, im Gegensatz zu Apache 1, wo es auf den gleichen Wert wie die SCRIPT_FILENAMEServervariable festgelegt wird, wenn es nicht von Apache ausgefüllt wird.
Diese Änderung wurde vorgenommen, um der CGI-Spezifikation zu entsprechen, dass PATH_TRANSLATED nur existieren sollte, wenn dies PATH_INFOdefiniert ist. Apache 2-Benutzer können AcceptPathInfo = OnInside httpd.confzum Definieren verwendenPATH_INFO

Quelle: php.net/manual

Das bin ich
quelle
1
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Waqar Alamgir
quelle
0

Zusammenfassung

In diesem Beispiel wird davon ausgegangen, dass Sie immer wissen, wo sich der Apache-Stammordner '/ var / www /' befindet, und dass Sie versuchen, den nächsten Ordnerpfad zu finden (z. B. '/ var / www / my_website_folder'). Dies funktioniert auch über ein Skript oder den Webbrowser, weshalb zusätzlicher Code vorhanden ist.

Code PHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

Beispiel

echo getHtmlRootFolder();

Ausgabe:

/var/www/somedir/

Einzelheiten:

Grundsätzlich wird zuerst versucht, DOCUMENT_ROOT abzurufen, wenn es '/ var / www /' enthält, und es dann verwendet. Andernfalls wird das aktuelle Verzeichnis (das im Projekt häufig vorhanden ist) abgerufen und der nächste Pfadwert basierend auf der Anzahl des $ root-Pfads abgerufen. Hinweis: Es wurden rtrim-Anweisungen hinzugefügt, um sicherzustellen, dass der Pfad in allen Fällen mit einem '/' endet. Es wird nicht geprüft, ob es größer als / var / www / sein muss. Es kann auch / var / www / als mögliche Antwort zurückgeben.

Mike Q.
quelle