Start · Sprachen · PHP · Referenz · apcu_entry

apcu_entry

Funktion

Holt einen vorhandenen APCu-Cache-Eintrag oder erzeugt ihn atomar über eine Callback-Funktion, falls er nicht existiert.

seit PHP 5.1.0 Kategorie: misc

Signatur

apcu_entry(string $key, callable $generator, int $ttl = 0): mixed

Beschreibung

apcu_entry() kombiniert das Lesen und das Schreiben eines Cache-Eintrags in einer einzigen, atomaren Operation. Existiert der Schlüssel $key bereits im Cache, wird der gespeicherte Wert sofort zurückgegeben. Andernfalls wird die übergebene Callable $generator aufgerufen, ihr Rückgabewert unter $key gespeichert und ebenfalls zurückgeliefert.

Der entscheidende Vorteil gegenüber der manuellen Kombination von apcu_fetch() und apcu_store() liegt in der Atomizität: Zwischen dem Prüfen des Schlüssels und dem Speichern des neuen Werts kann kein anderer Prozess denselben Schlüssel befüllen (Race Condition). Das verhindert das sogenannte Cache-Stampede-Problem, bei dem viele gleichzeitige Anfragen denselben teuren Wert regenerieren, weil der Cache leer ist.

Der optionale Parameter $ttl gibt die Lebensdauer des gespeicherten Eintrags in Sekunden an. Ein Wert von 0 (Standard) bedeutet, dass der Eintrag bis zum Neustart des Webservers oder bis der Cache überläuft gültig bleibt.

Typische Anwendungsfälle sind das Cachen teurer Datenbankabfragen, API-Antworten oder rechenintensiver Berechnungen in Umgebungen mit hohem parallelen Anfrage-Aufkommen.

Parameter

Name Typ Default Beschreibung
$key Pflicht string Der eindeutige Schlüssel, unter dem der Wert im APCu-Cache gespeichert wird bzw. gesucht wird.
$generator Pflicht callable Eine Callable, die aufgerufen wird, wenn der Schlüssel noch nicht im Cache vorhanden ist. Die Callable erhält den Schlüssel (string) als Parameter und muss den zu cachenden Wert zurückgeben.
$ttl int 0 Time-to-live in Sekunden. 0 bedeutet, dass der Eintrag ohne feste Ablaufzeit gespeichert wird. Nach Ablauf der angegebenen Zeit wird der Eintrag als ungültig betrachtet und beim nächsten Aufruf neu erzeugt.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den aus dem Cache gelesenen oder von der Callable $generator erzeugten und neu gespeicherten Wert zurück. Im Fehlerfall (z. B. wenn APCu deaktiviert ist oder der Generator fehlschlägt) wird false zurückgegeben.

Beispiele

Datenbankabfrage mit apcu_entry cachen

<?php
// Simulierte teure Datenbankabfrage
function fetchUsersFromDatabase(): array {
    // Stellt eine aufwändige DB-Abfrage dar
    return ['Alice', 'Bob', 'Charlie'];
}

$users = apcu_entry('user_list', function (string $key): array {
    echo "Cache miss – Daten werden geladen (Key: $key)\n";
    return fetchUsersFromDatabase();
}, 300); // 5 Minuten cachen

print_r($users);
// Zweiter Aufruf greift direkt aus dem Cache
$usersFromCache = apcu_entry('user_list', function (string $key): array {
    echo "Cache miss – Daten werden geladen (Key: $key)\n";
    return fetchUsersFromDatabase();
}, 300);

print_r($usersFromCache);
Cache miss – Daten werden geladen (Key: user_list) Array ( [0] => Alice [1] => Bob [2] => Charlie ) Array ( [0] => Alice [1] => Bob [2] => Charlie )

Rechenintensiven Wert atomar cachen

<?php
$cacheKey = 'fibonacci_50';

$result = apcu_entry($cacheKey, function (): int {
    // Simuliert eine rechenintensive Operation
    $a = 0;
    $b = 1;
    for ($i = 2; $i <= 50; $i++) {
        [$a, $b] = [$b, $a + $b];
    }
    return $b;
}, 3600); // 1 Stunde cachen

echo "Fibonacci(50) = $result\n";
Fibonacci(50) = 12586269025

// Wichtig · Fallstricke

APCu muss aktiviert sein: apcu_entry() setzt voraus, dass die APCu-Extension installiert und in der php.ini aktiviert ist (extension=apcu). Im CLI-Kontext muss zusätzlich apc.enable_cli=1 gesetzt sein, damit APCu funktioniert.

Achtung bei Ausnahmen im Generator: Wirft die übergebene Callable eine Exception, wird kein Wert gecacht und die Exception propagiert nach oben. Stellen Sie sicher, dass der Generator robust implementiert ist, um unerwartetes Verhalten zu vermeiden.

Kein verteilter Cache: APCu ist ein prozesslokal arbeitender Speicher-Cache. Er wird nicht zwischen verschiedenen Servern oder PHP-FPM-Prozessen geteilt. Für verteilte Umgebungen sollten stattdessen Lösungen wie Redis oder Memcached eingesetzt werden.