Signatur
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
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";
}
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";
}
// 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.