Signatur
Beschreibung
PHP unterhält intern einen Realpath-Cache, um wiederholte Dateisystemzugriffe beim Auflösen von Pfaden zu beschleunigen. realpath_cache_get() liefert eine Momentaufnahme dieses Caches als assoziatives Array, in dem die Schlüssel die aufgelösten Pfade und die Werte Metainformationen (TTL, Ablaufzeit, Existenz, Inode-Nummer etc.) sind.
Die Funktion ist primär für Diagnose- und Debugging-Zwecke nützlich: Man kann prüfen, welche Pfade zwischengespeichert sind, wann deren Cache-Einträge ablaufen und ob PHP veraltete Pfadinformationen verwendet. Dies ist besonders relevant bei Deployment-Prozessen, bei denen Symlinks gewechselt werden, oder wenn open_basedir aktiv ist.
Jeder Cache-Eintrag enthält typischerweise folgende Schlüssel: key (Hash des Pfades), is_dir (boolean, ob Verzeichnis), realpath (aufgelöster absoluter Pfad), expires (Unix-Timestamp des Ablaufs) sowie ggf. is_writeable. Die Gültigkeitsdauer eines Eintrags wird über die realpath_cache_ttl-INI-Direktive gesteuert.
Um den Cache-Speicherbedarf zu ermitteln, kann ergänzend realpath_cache_size() verwendet werden. Mit clearstatcache(true) lässt sich der gesamte Realpath-Cache leeren.
Rückgabewert
realpath, expires, is_dir und key. Ist der Cache deaktiviert (z. B. realpath_cache_ttl=0) oder leer, wird ein leeres Array zurückgegeben.Beispiele
Cache-Inhalt nach Dateioperationen inspizieren
<?php
// Einige Dateizugriffe ausführen, damit der Cache befüllt wird
$path1 = realpath(__FILE__);
$path2 = realpath(__DIR__);
$cache = realpath_cache_get();
foreach ($cache as $entry => $info) {
printf(
"Pfad : %s\nRealpath: %s\nIst Dir : %s\nLäuft ab: %s\n\n",
$entry,
$info['realpath'],
$info['is_dir'] ? 'ja' : 'nein',
date('Y-m-d H:i:s', $info['expires'])
);
}
Prüfen, ob ein bestimmter Pfad im Cache vorhanden ist
<?php
$checkPath = realpath('/var/www/html/config.php');
$cache = realpath_cache_get();
if (isset($cache[$checkPath])) {
$entry = $cache[$checkPath];
echo "Pfad ist gecacht.\n";
echo "Läuft ab: " . date('H:i:s', $entry['expires']) . "\n";
echo "Cache-Größe gesamt: " . realpath_cache_size() . " Bytes\n";
} else {
echo "Pfad nicht im Cache vorhanden.\n";
}
// Wichtig · Fallstricke
Hinweis zur CLI vs. FPM/Apache: In der CLI wird der Cache nur für die Dauer eines einzelnen Skriptlaufs gehalten. In persistenten Prozessen (PHP-FPM, mod_php) kann der Cache über mehrere Requests hinweg bestehen bleiben, was bei häufig geänderten Symlinks (z. B. Zero-Downtime-Deployments) zu veralteten Pfadauflösungen führen kann. In solchen Fällen sollte clearstatcache(true) am Deployment-Ende aufgerufen werden.
Wenn open_basedir gesetzt ist, werden nur Pfade innerhalb des erlaubten Verzeichnisses gecacht. realpath_cache_get() liefert dann ebenfalls nur diese Einträge.
Die Funktion steht nicht zur Verfügung, wenn der Cache über realpath_cache_size=0 deaktiviert wurde – in diesem Fall wird immer ein leeres Array zurückgegeben.