Start · Sprachen · PHP · Referenz · Memcache

Memcache

Klasse

Repräsentiert eine Verbindung zu einem oder mehreren Memcache-Servern und ermöglicht das Speichern, Abrufen und Verwalten von Daten im verteilten Cache.

seit PHP 2.0.0 Kategorie: db

Signatur

class Memcache

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();
?>
Alice

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";
}
?>
Daten aus der Datenbank geladen und gecacht. 1: Laptop 2: Monitor

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();
?>
Seitenaufrufe: 2

// 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.