Signatur
Beschreibung
Die Memcache-Klasse ist Teil der PECL-Erweiterung memcache (nicht zu verwechseln mit memcached) und stellt eine objektorientierte Schnittstelle zum gleichnamigen In-Memory-Caching-System bereit. Sie ermöglicht das Verbinden mit einem oder mehreren Memcache-Servern, wobei auch Server-Pools mit automatischer Lastverteilung unterstützt werden.
Typische Einsatzgebiete sind das Zwischenspeichern teurer Datenbankabfragen, gerenderter HTML-Fragmente oder Sitzungsdaten, um die Antwortzeiten von Webanwendungen deutlich zu reduzieren. Durch das Speichern von Schlüssel-Wert-Paaren im RAM können Zugriffszeiten im Sub-Millisekunden-Bereich erreicht werden.
Die Klasse unterstützt optionale Datenkompression mittels MEMCACHE_COMPRESSED sowie das Setzen von Ablaufzeiten (TTL) für gespeicherte Einträge. Mithilfe von addServer() können mehrere Server zum Pool hinzugefügt werden; die Erweiterung verteilt Schlüssel automatisch per konsistentem Hashing auf die verfügbaren Knoten.
Für neue Projekte wird häufig die neuere Memcached-Erweiterung empfohlen, da sie mehr Funktionen (z. B. CAS-Operationen, binäres Protokoll) bietet. Die Memcache-Klasse ist jedoch weiterhin weit verbreitet und auf vielen Produktivsystemen im Einsatz.
Beispiele
Verbindung aufbauen und Wert speichern/abrufen
<?php
$memcache = new Memcache();
// Mit Memcache-Server verbinden
$memcache->connect('127.0.0.1', 11211);
// Wert mit 60 Sekunden TTL speichern
$memcache->set('benutzername', 'Alice', 0, 60);
// Wert abrufen
$name = $memcache->get('benutzername');
echo $name; // Alice
$memcache->close();
?>
Server-Pool mit mehreren Knoten und Caching einer Datenbankabfrage
<?php
$memcache = new Memcache();
// Mehrere Server zum Pool hinzufügen
$memcache->addServer('cache1.example.com', 11211);
$memcache->addServer('cache2.example.com', 11211);
$cacheKey = 'produkte_liste';
$produkte = $memcache->get($cacheKey);
if ($produkte === false) {
// Cache-Miss: Daten aus der Datenbank laden (simuliert)
$produkte = [
['id' => 1, 'name' => 'Laptop'],
['id' => 2, 'name' => 'Monitor'],
];
// Daten mit Kompression und 5 Minuten TTL cachen
$memcache->set($cacheKey, $produkte, MEMCACHE_COMPRESSED, 300);
echo "Daten aus der Datenbank geladen und gecacht.\n";
} else {
echo "Daten aus dem Cache geladen.\n";
}
foreach ($produkte as $p) {
echo $p['id'] . ': ' . $p['name'] . "\n";
}
?>
Atomares Inkrementieren eines Zählers
<?php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);
// Zähler initialisieren
$memcache->set('seitenaufruf', 0, 0, 3600);
// Atomares Inkrementieren
$memcache->increment('seitenaufruf', 1);
$memcache->increment('seitenaufruf', 1);
$count = $memcache->get('seitenaufruf');
echo "Seitenaufrufe: " . $count;
$memcache->close();
?>
// Wichtig · Fallstricke
Sicherheit: Memcache bietet standardmäßig keine Authentifizierung. Stellen Sie sicher, dass der Memcache-Port (Standard: 11211) nicht öffentlich erreichbar ist. Binden Sie den Dienst an 127.0.0.1 oder schützen Sie ihn durch Firewallregeln, da andernfalls beliebige Clients Daten lesen und überschreiben können.
Datenserialisierung: Die Klasse serialisiert PHP-Werte (Arrays, Objekte) automatisch beim Speichern und deserialisiert sie beim Abrufen. Achten Sie darauf, dass die Klasse beim Deserialisieren von Objekten im Scope verfügbar ist, sonst entsteht ein __PHP_Incomplete_Class-Objekt.
Unterschied zu Memcached: Dies ist die ältere memcache-PECL-Erweiterung. Die neuere memcached-Erweiterung (Klasse Memcached) unterstützt das binäre Protokoll, CAS-Operationen (Check-and-Set) und SASL-Authentifizierung. Für neue Projekte sollte die Memcached-Erweiterung bevorzugt werden.
Rückgabe bei Cache-Miss: get() gibt false zurück, wenn der Schlüssel nicht existiert oder abgelaufen ist. Da auch der gespeicherte Wert false sein kann, sollte zur Unterscheidung getExtended() oder eine eigene Wrapper-Lösung eingesetzt werden.