Start · Sprachen · PHP · Referenz · memcache_decrement

memcache_decrement

Funktion

Verringert den numerischen Wert eines vorhandenen Memcache-Eintrags um den angegebenen Betrag.

seit PHP 4.3.3 Kategorie: db

Signatur

memcache_decrement(Memcache $memcache, string $key, int $value = 1): int|false

Beschreibung

memcache_decrement() vermindert den aktuell gespeicherten numerischen Wert eines Memcache-Schlüssels um den angegebenen Betrag ($value). Die Funktion ist das prozedurale Äquivalent zur Methode Memcache::decrement() und arbeitet atomar auf dem Memcache-Server, sodass Race Conditions bei gleichzeitigen Zugriffen vermieden werden.

Typische Anwendungsfälle sind das Dekrementieren von Zählern (z. B. verfügbare Ressourcen, verbleibende API-Aufrufe oder Download-Kontingente). Der gespeicherte Wert wird dabei als vorzeichenloser 64-Bit-Integer behandelt; er kann nicht unter 0 fallen – erreicht der Wert 0, bleibt er dort.

Existiert der angegebene Schlüssel nicht oder enthält er keinen numerischen Wert, gibt die Funktion false zurück. Im Gegensatz zu memcache_increment() legt memcache_decrement() den Eintrag nicht automatisch an, wenn er fehlt.

Die objektorientierte Variante ist Memcache::decrement(). Für die neuere Memcached-Extension (mit d am Ende) steht Memcached::decrement() zur Verfügung, das eine etwas andere API bietet.

Parameter

Name Typ Default Beschreibung
$memcache Pflicht Memcache Eine aktive Memcache-Verbindungsressource, die zuvor mit memcache_connect() oder memcache_pconnect() erstellt wurde.
$key Pflicht string Der Schlüssel (Key) des Eintrags, dessen Wert dekrementiert werden soll.
$value int 1 Der Betrag, um den der Wert verringert werden soll. Standardmäßig wird um 1 dekrementiert.

Rückgabewert

Typ
int|false
Beschreibung
Gibt den neuen (bereits dekrementieren) Wert des Eintrags als int zurück. Bei Misserfolg – z. B. wenn der Schlüssel nicht existiert oder kein numerischer Wert gespeichert ist – wird false zurückgegeben.

Beispiele

Einfaches Dekrementieren eines Zählers

<?php
// Verbindung zum Memcache-Server herstellen
$memcache = memcache_connect('localhost', 11211);

// Ausgangswert setzen
memcache_set($memcache, 'download_quota', 10, 0, 3600);

// Wert um 1 verringern (Standard)
$neuerWert = memcache_decrement($memcache, 'download_quota');
echo 'Verbleibende Downloads: ' . $neuerWert . PHP_EOL; // 9

// Wert um 3 verringern
$neuerWert = memcache_decrement($memcache, 'download_quota', 3);
echo 'Verbleibende Downloads: ' . $neuerWert . PHP_EOL; // 6

memcache_close($memcache);
Verbleibende Downloads: 9 Verbleibende Downloads: 6

Prüfung auf Fehler beim Dekrementieren

<?php
$memcache = memcache_connect('localhost', 11211);

// Versuch, einen nicht vorhandenen Schlüssel zu dekrementieren
$ergebnis = memcache_decrement($memcache, 'nicht_vorhanden');

if ($ergebnis === false) {
    echo 'Schlüssel existiert nicht oder ist nicht numerisch.' . PHP_EOL;
} else {
    echo 'Neuer Wert: ' . $ergebnis . PHP_EOL;
}

// Wert von 0 kann nicht weiter sinken
memcache_set($memcache, 'zaehler', 0, 0, 60);
$ergebnis = memcache_decrement($memcache, 'zaehler', 5);
echo 'Wert bei 0: ' . $ergebnis . PHP_EOL; // bleibt 0

memcache_close($memcache);
Schlüssel existiert nicht oder ist nicht numerisch. Wert bei 0: 0

// Wichtig · Fallstricke

Nicht-Existenz des Schlüssels: Fehlt der Eintrag im Cache, wird kein neuer Eintrag angelegt – dies unterscheidet sich von manchen anderen Cache-Operationen. Der Rückgabewert false muss daher mit === geprüft werden, da 0 ein valider Rückgabewert ist.

Minimalwert: Der Wert wird intern als vorzeichenloser Integer behandelt und kann nicht negativ werden. Wenn das Dekrementieren zu einem negativen Ergebnis führen würde, wird der Wert auf 0 gesetzt.

Deprecation / Extension: Die memcache-Extension (ohne d) gilt als veraltet und wird aktiv durch die memcached-Extension ersetzt. Für neue Projekte sollte Memcached::decrement() bevorzugt werden.

Atomarität: Die Operation wird atomar vom Memcache-Server ausgeführt, sodass sie auch bei parallelen Zugriffen korrekte Ergebnisse liefert – ein manuelles Lesen, Verringern und Zurückschreiben ist daher nicht notwendig und sollte vermieden werden.