Bei der täglichen PHP -Entwicklung ist die Parsing -Dateipfade eine der häufigsten Anforderungen. Die RealPath () -Funktion ist ein leistungsstarkes Tool, um normalisierte absolute Wege in Dateien zu erhalten, aber ihr Verhalten kann im Umgang mit Symlinks verwirrend sein. In diesem Artikel wird systematisch das Arbeitsprinzip von RealPath () erklärt und praktische Tipps zur korrekten Verwendung in tatsächlichen Projekten zur Behandlung symbolischer Links teilen.
RealPath () gibt einen normalisierten absoluten Weg eines Pfades zurück. Dies bedeutet, dass es Elemente wie z. , .. und symbolische Links.
Beispielcode:
$path = realpath('./myfolder/../link-to-file.txt');
echo $path;
In diesem Beispiel wird der ... auf dem Weg analysiert, und wenn die symbolische Verbindung besteht, wird er in den realen Weg analysiert.
Wenn Sie RealPath () für einen symbolischen Link verwenden, gibt es den realen Pfad zurück, auf den die Link zeigt, nicht den Ort des Links selbst. Dies ist möglicherweise nicht das, was Sie in einigen Fällen wollen.
Zum Beispiel:
// Annahmen link.txt ist eine symbolische Verbindung,Orientierung /data/files/realfile.txt
$resolvedPath = realpath('/var/www/html/link.txt');
echo $resolvedPath;
If /var/www/html/link.txt ist ein symlink, realPath () outs /data/files/realfile.txt anstelle von /var/www/html/link.txt .
RealPath () hängt von der Existenz des Zielwegs ab. Wenn keine Ebene im Pfad vorhanden ist, gibt es falsch zurück. Dies bedeutet, dass es nicht für Dateipfade verwendet werden kann, die noch nicht erstellt wurden .
Beispiel:
$nonExistent = realpath('/path/to/nonexistent/file.txt');
var_dump($nonExistent); // Ausgabe bool(false)
Bevor Sie RealPath () anrufen, stellen Sie sicher, dass der Weg vorhanden ist:
$path = '/var/www/html/link.txt';
if (file_exists($path)) {
echo realpath($path);
} else {
echo "Der Weg existiert nicht";
}
Wenn Sie den Pfad zum symbolischen Link selbst anstelle des Ziels finden möchten, auf das es zeigt, können Sie Readlink () verwenden:
$link = '/var/www/html/link.txt';
if (is_link($link)) {
echo readlink($link); // Kehren Sie zum Link -Ziel zurück
}
Um den absoluten Weg zum symbolischen Link selbst zu erreichen, können Sie DirName () und Readlink () kombinieren:
$link = '/var/www/html/link.txt';
if (is_link($link)) {
$target = readlink($link);
$realTarget = realpath(dirname($link) . '/' . $target);
echo $realTarget;
}
Wenn Sie den Pfad, den symbolische Verknüpfung, "analysieren" möchten, wenn der Pfad nicht existiert, die Auflösung anpassen können:
function custom_realpath($path) {
$parts = explode('/', $path);
$absolutes = [];
foreach ($parts as $part) {
if ($part === '' || $part === '.') continue;
if ($part === '..') {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
return '/' . implode('/', $absolutes);
}
$resolved = custom_realpath('/var/www/html/../html/link.txt');
echo $resolved;
Beachten Sie, dass diese Methode keine symbolischen Links analysiert, sondern nur die. Und . auf dem Weg.
Angenommen, Sie entwickeln einen Webdateibrowser und möchten, dass der vom Benutzer hochgeladene Pfad auf das Verzeichnis /var/www/data beschränkt ist. Sie müssen sicherstellen, dass sich der Parsenpfad noch in diesem Verzeichnis befindet:
$base = realpath('/var/www/data');
$userPath = $_GET['path']; // Zum Beispiel:link/to/file.txt
$fullPath = realpath($base . '/' . $userPath);
if ($fullPath && strpos($fullPath, $base) === 0) {
echo "Zugriff zulassen:$fullPath";
} else {
echo "Illegaler Weg";
}
Wenn Link/to/Datei.txt ein Symlink ist, löst RealPath seinen Zielort auf. Sie müssen bestätigen, dass sich das analysierte Ziel immer noch innerhalb von $ Base befindet, um Verzeichnis -Durchlaufangriffe zu verhindern.
Funktion | Funktionsbeschreibung |
---|---|
RealPath () | Gibt den absoluten Pfad zurück, analysiert Symlink und Pfadkomponenten |
__Dir__ | Das Verzeichnis, in dem sich die aktuelle Datei befindet, die Kompilierungszeitentscheidung |
getCwd () | Aktuelles Arbeitsverzeichnis, Laufzeitentscheidung |
Wenn Sie Pfade verwenden, können Sie bei der Auswahl der richtigen Funktion die Verwirrung von Pfaden vermeiden, insbesondere wenn eine CLI und eine Webumgebung gemischt sind.
RealPath () ist ein unverzichtbares Tool im PHP -Dateipfadmanagement, aber Sie müssen vorsichtig sein, wenn Sie symbolische Links behandeln. Es kann sicherer verwendet werden, indem is_link () , readlink () und Pfadüberprüfungstechniken kombiniert werden. Nur durch das Verständnis der Einschränkungen können wir robusten Code unter komplexen Dateisystemstrukturen schreiben.
Weitere Beispiele für die Verwendung von PHP-Dateipfaden und symbolischen Links finden Sie unter: https://gitbox.net/articles/php-symlink-realpath