Start · Sprachen · PHP · Referenz · apcu_exists

apcu_exists

Funktion

Prüft, ob ein oder mehrere Einträge im APCu-Benutzer-Cache vorhanden sind, ohne deren Wert abzurufen.

seit PHP 4.0.0 Kategorie: misc

Signatur

apcu_exists(array|string $keys): array|bool

Beschreibung

apcu_exists() ermöglicht es, das Vorhandensein eines Cache-Eintrags zu überprüfen, ohne den eigentlichen Wert zu laden. Das ist effizienter als eine Kombination aus apcu_fetch() mit anschließender Prüfung, da kein Deserialisierungsaufwand entsteht.

Wird ein einzelner String übergeben, liefert die Funktion true, wenn der Schlüssel im Cache existiert, andernfalls false. Wird ein Array von Schlüsseln übergeben, gibt die Funktion ein assoziatives Array zurück, das nur die gefundenen Schlüssel enthält – mit dem jeweiligen Schlüsselnamen als Schlüssel und true als Wert.

Die Funktion ist besonders nützlich, wenn man überprüfen möchte, ob ein Cache-Eintrag noch gültig ist, bevor man ihn erneut befüllt, oder wenn man das Vorhandensein mehrerer Einträge gleichzeitig effizient testen möchte.

Zu beachten ist, dass zwischen dem Aufruf von apcu_exists() und einem nachfolgenden apcu_fetch() der Eintrag durch einen anderen Prozess gelöscht worden sein könnte (Race Condition). In solchen Fällen sollte direkt apcu_fetch() mit dem zweiten Parameter $success verwendet werden.

Parameter

Name Typ Default Beschreibung
$keys Pflicht array|string Ein einzelner Cache-Schlüssel als String oder ein Array von Cache-Schlüsseln, deren Existenz geprüft werden soll.

Rückgabewert

Typ
array|bool
Beschreibung

Bei einem einzelnen String: true, wenn der Schlüssel im Cache existiert, false wenn nicht.

Bei einem Array von Schlüsseln: Ein assoziatives Array, das nur die vorhandenen Schlüssel enthält (Schlüssel → true). Nicht vorhandene Schlüssel fehlen im Rückgabe-Array.

Beispiele

Einzelnen Cache-Schlüssel prüfen

<?php
// Eintrag in den Cache schreiben
apcu_store('user_42', ['name' => 'Max Mustermann', 'email' => 'max@example.com']);

// Existenz prüfen, bevor der Wert geladen wird
if (apcu_exists('user_42')) {
    echo "Eintrag 'user_42' ist im Cache vorhanden.\n";
} else {
    echo "Eintrag 'user_42' muss neu geladen werden.\n";
}

// Nicht vorhandener Schlüssel
if (!apcu_exists('user_99')) {
    echo "Eintrag 'user_99' ist NICHT im Cache.\n";
}
Eintrag 'user_42' ist im Cache vorhanden. Eintrag 'user_99' ist NICHT im Cache.

Mehrere Schlüssel gleichzeitig prüfen

<?php
// Mehrere Einträge speichern
apcu_store('config_db', 'mysql://localhost/mydb');
apcu_store('config_cache', 'redis://localhost:6379');
// 'config_mail' wird absichtlich NICHT gespeichert

$keysToCheck = ['config_db', 'config_cache', 'config_mail'];
$existing = apcu_exists($keysToCheck);

echo "Vorhandene Schlüssel:\n";
foreach ($existing as $key => $value) {
    echo "  - {$key}\n";
}

$missing = array_diff($keysToCheck, array_keys($existing));
echo "Fehlende Schlüssel:\n";
foreach ($missing as $key) {
    echo "  - {$key}\n";
}
Vorhandene Schlüssel: - config_db - config_cache Fehlende Schlüssel: - config_mail

// Wichtig · Fallstricke

Race Condition: Da APCu in einer Shared-Memory-Umgebung mit mehreren Prozessen arbeitet, kann ein Eintrag zwischen dem Aufruf von apcu_exists() und einem folgenden apcu_fetch() von einem anderen Prozess gelöscht werden. Für atomares Lesen sollte stattdessen direkt apcu_fetch($key, $success) genutzt werden und $success ausgewertet werden.

CLI-Modus: APCu ist standardmäßig im CLI-Modus deaktiviert. Um es dort zu aktivieren, muss in der php.ini die Option apc.enable_cli=1 gesetzt werden.

Ablaufzeit: apcu_exists() berücksichtigt die TTL – ein abgelaufener Eintrag gilt als nicht vorhanden und wird daher false zurückgeben.