Start · Sprachen · PHP · Referenz · realpath_cache_get

realpath_cache_get

Funktion

Gibt alle aktuell im Realpath-Cache gespeicherten Einträge zurück.

seit PHP 5.3.2 Kategorie: io

Signatur

realpath_cache_get(): array

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

Typ
array
Beschreibung
Ein assoziatives Array der zwischengespeicherten Realpath-Einträge. Die Schlüssel sind die originalen (unaufgelösten) Pfade; die Werte sind Arrays mit Metainformationen wie 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'])
    );
}
Pfad : /var/www/html/index.php Realpath: /var/www/html/index.php Ist Dir : nein Läuft ab: 2024-06-01 12:04:07 Pfad : /var/www/html Realpath: /var/www/html Ist Dir : ja Läuft ab: 2024-06-01 12:04:07

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";
}
Pfad ist gecacht. Läuft ab: 12:04:07 Cache-Größe gesamt: 4096 Bytes

// 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.