getcwd()
Erfahre, wie PHPs getcwd() das aktuelle Arbeitsverzeichnis zurückgibt, wann false zurückkommt und wie es sich von __DIR__ und chdir() unterscheidet.
Die PHP-Funktion getcwd()
getcwd() ist eine eingebaute PHP-Funktion, die das aktuelle Arbeitsverzeichnis zurückgibt — das Verzeichnis, gegen das PHP relative Dateipfade auflöst. Sie nimmt keine Argumente entgegen und gibt den absoluten Pfad als string zurück, oder false bei einem Fehler.
Diese Seite behandelt die Syntax, was der Rückgabewert tatsächlich bedeutet, die Fälle, in denen false zurückgegeben wird, und wie sich getcwd() von der magischen Konstante __DIR__ und der Funktion chdir() unterscheidet.
Syntax
getcwd(): string|false- Parameter: keine.
- Rückgabewert: der absolute Pfad des aktuellen Arbeitsverzeichnisses bei Erfolg, oder
falsebei einem Fehler (z. B. wenn ein übergeordnetes Verzeichnis des aktuellen Pfades das Lese- oder Suchrechte-Bit nicht gesetzt hat).
Das Arbeitsverzeichnis ist ein prozessweiter Zustand. Es beginnt als das Verzeichnis, von dem aus PHP gestartet wurde, nicht das Verzeichnis, in dem das laufende Skript liegt. Auf einem Webserver ist es in der Regel das Dokumentstammverzeichnis oder das Startverzeichnis des Servers; auf der CLI ist es das Verzeichnis, von dem aus du das Skript gestartet hast.
Einfaches Beispiel
<?php
echo getcwd();Ausgabe (der genaue Pfad hängt davon ab, wo das Skript ausgeführt wird):
/home/user/public_htmlFehlerbehandlung
Da getcwd() false zurückgeben kann, behandle das Ergebnis als string|false statt einen string vorauszusetzen. Dies ist wichtig, wenn du daraus Pfade aufbaust — die Verkettung von false erzeugt stillschweigend ein leeres Präfix.
<?php
$dir = getcwd();
if ($dir === false) {
echo "Unable to determine the current working directory.";
} else {
echo "Working in: $dir";
}Dateipfade aufbauen
Ein häufiger Einsatz ist die Auflösung eines Pfades relativ zu dem Ort, von dem aus das Skript ausgeführt wird, und die anschließende Durchführung von Dateioperationen dort. Überprüfe immer, ob die Datei tatsächlich geöffnet wurde, bevor du in sie schreibst:
<?php
$current_dir = getcwd();
$file_path = $current_dir . DIRECTORY_SEPARATOR . 'test.txt';
$file_handle = fopen($file_path, 'w');
if ($file_handle === false) {
echo "Could not open file for writing.";
} else {
fwrite($file_handle, 'This is a test file.');
fclose($file_handle);
echo "File written to: $file_path";
}Die Verwendung der Konstante DIRECTORY_SEPARATOR anstelle eines fest codierten / stellt sicher, dass der Pfad auf allen Betriebssystemen korrekt ist. Siehe fopen() für die verfügbaren Dateimodi.
getcwd() vs. DIR
Dies ist die häufigste Fehlerquelle. getcwd() gibt das Laufzeit-Arbeitsverzeichnis zurück, das sich ändern kann. __DIR__ wird zur Kompilierzeit aufgelöst und zeigt immer auf das Verzeichnis der aktuellen Quelldatei — es ändert sich nie, auch nicht nach einem Aufruf von chdir().
- Verwende
__DIR__, um Dateien einzubinden oder Assets zu laden, die neben deinem Skript liegen (require __DIR__ . '/config.php';). Dies ist fast immer das Richtige für projektrelative Pfade. - Verwende
getcwd(), wenn du wirklich wissen möchtest, von wo der Prozess gestartet wurde, z. B. bei einem CLI-Tool, das im aktuellen Ordner des Benutzers arbeitet.
Das Arbeitsverzeichnis kann mit chdir() gewechselt werden:
<?php
echo getcwd(), PHP_EOL; // e.g. /home/user/project
chdir('..');
echo getcwd(), PHP_EOL; // parent directory, e.g. /home/userVerwandte Funktionen
chdir()— das aktuelle Arbeitsverzeichnis wechseln.realpath()— einen relativen Pfad zu einem kanonischen absoluten Pfad auflösen.dirname()— den übergeordneten Verzeichnisanteil eines Pfades ermitteln.scandir()— die Einträge in einem Verzeichnis auflisten.
Fazit
getcwd() gibt den absoluten Pfad des aktuellen Arbeitsverzeichnisses des Prozesses zurück, oder false, wenn er nicht gelesen werden kann. Prüfe auf false, bevor du das Ergebnis verwendest, bevorzuge DIRECTORY_SEPARATOR beim Zusammensetzen von Pfaden, und greife auf __DIR__ zurück, wenn du einen Pfad relativ zur Skriptdatei statt zum Laufzeitverzeichnis benötigst.