Signatur
Beschreibung
memcache_replace() aktualisiert den Wert eines Eintrags im Memcache-Cache, sofern der angegebene Schlüssel bereits vorhanden ist. Im Gegensatz zu memcache_set() wird kein neuer Eintrag angelegt, wenn der Schlüssel fehlt — die Funktion gibt in diesem Fall false zurück. Dies macht sie ideal für Szenarien, in denen sichergestellt werden soll, dass nur bestehende Daten überschrieben werden.
Das Verhalten ist das prozeduraler Stil-Pendant zur objektorientierten Methode Memcache::replace(). Der Wert ($var) kann ein beliebiger PHP-Typ sein; Arrays und Objekte werden automatisch serialisiert und beim Abrufen deserialisiert.
Mit dem Parameter $flag kann die Datenkompression aktiviert werden (Konstante MEMCACHE_COMPRESSED), was bei großen Datenmengen den Speicherbedarf und die Netzwerklast reduziert. Der $expire-Parameter legt die Lebensdauer des Eintrags in Sekunden fest; bei 0 verfällt der Eintrag nicht automatisch.
Hinweis: Die memcache-Extension (PECL) sollte nicht mit der neueren memcached-Extension verwechselt werden. Für neue Projekte wird die Nutzung der memcached-Extension empfohlen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $memcache Pflicht | Memcache | Eine gültige Memcache-Verbindungsressource, die zuvor mit memcache_connect() oder memcache_pconnect() erstellt wurde. |
|
| $key Pflicht | string | Der Schlüssel, unter dem der Wert im Cache gespeichert ist. Nur wenn dieser Schlüssel bereits existiert, wird der Wert ersetzt. | |
| $var Pflicht | mixed | Der neue Wert, der gespeichert werden soll. Skalare Typen werden direkt gespeichert, Arrays und Objekte werden automatisch serialisiert. | |
| $flag | int | 0 | Optionales Bit-Flag. Verwende MEMCACHE_COMPRESSED, um den Wert mit zlib zu komprimieren. Bei 0 wird keine Kompression angewendet. |
| $expire | int | 0 | Ablaufzeit des Eintrags in Sekunden. Werte bis 2592000 (30 Tage) gelten als relative Sekunden ab jetzt; größere Werte werden als Unix-Timestamp interpretiert. 0 bedeutet kein automatischer Ablauf. |
Rückgabewert
true zurück, wenn der Eintrag erfolgreich ersetzt wurde. Gibt false zurück, wenn der angegebene Schlüssel nicht im Cache vorhanden ist oder ein Fehler auftrat.Beispiele
Vorhandenen Cache-Eintrag ersetzen
<?php
$memcache = memcache_connect('localhost', 11211);
// Eintrag zunächst setzen
memcache_set($memcache, 'benutzername', 'Max Mustermann', 0, 3600);
// Eintrag ersetzen (funktioniert, da Schlüssel existiert)
$erfolg = memcache_replace($memcache, 'benutzername', 'Erika Musterfrau', 0, 3600);
if ($erfolg) {
echo 'Eintrag erfolgreich ersetzt.';
} else {
echo 'Ersetzen fehlgeschlagen – Schlüssel nicht vorhanden.';
}
$wert = memcache_get($memcache, 'benutzername');
echo PHP_EOL . 'Aktueller Wert: ' . $wert;
memcache_close($memcache);
?>
Fehlgeschlagenes Ersetzen bei nicht vorhandenem Schlüssel
<?php
$memcache = memcache_connect('localhost', 11211);
// Schlüssel existiert NICHT im Cache
$erfolg = memcache_replace($memcache, 'nicht_vorhanden', 'Wert', 0, 600);
if ($erfolg) {
echo 'Ersetzt.';
} else {
echo 'Fehlgeschlagen: Schlüssel existiert nicht im Cache.';
}
memcache_close($memcache);
?>
Komprimiertes Ersetzen eines Array-Wertes
<?php
$memcache = memcache_connect('localhost', 11211);
$daten = ['name' => 'Test', 'werte' => range(1, 1000)];
// Ursprünglichen Eintrag anlegen
memcache_set($memcache, 'grosser_datensatz', $daten, MEMCACHE_COMPRESSED, 1800);
// Mit aktualisierten Daten ersetzen und komprimieren
$daten['name'] = 'Aktualisiert';
$erfolg = memcache_replace($memcache, 'grosser_datensatz', $daten, MEMCACHE_COMPRESSED, 1800);
echo $erfolg ? 'Komprimierter Eintrag erfolgreich ersetzt.' : 'Ersetzen fehlgeschlagen.';
memcache_close($memcache);
?>
// Wichtig · Fallstricke
Veraltete Extension: Die memcache-PECL-Extension gilt als veraltet. Für neue Projekte wird die memcached-Extension empfohlen, die das binäre Protokoll, konsistentes Hashing und weitere Features unterstützt.
Race Conditions: Zwischen dem Prüfen der Existenz eines Schlüssels und dem Aufruf von memcache_replace() kann ein anderer Prozess den Eintrag löschen. memcache_replace() ist daher kein atomares Check-and-Set-Verfahren. Für CAS-Operationen (Compare-and-Swap) sollte die memcached-Extension mit Memcached::cas() verwendet werden.
Schlüssellänge: Memcache-Schlüssel dürfen maximal 250 Zeichen lang sein und keine Leerzeichen oder Steuerzeichen enthalten.