Signatur
Beschreibung
Memcached ist eine PHP-Erweiterung, die eine objektorientierte Schnittstelle zum Memcached-Dienst bereitstellt. Memcached ist ein hochperformantes, verteiltes In-Memory-Caching-System, das häufig eingesetzt wird, um Datenbankabfragen, API-Antworten oder beliebige Berechnungsergebnisse zwischenzuspeichern und so die Antwortzeiten von Webanwendungen drastisch zu reduzieren.
Die Klasse unterstützt mehrere Server (Server-Pools) mit konfigurierbaren Gewichtungen sowie konsistentes Hashing, sodass sich Caching-Lasten gleichmäßig verteilen lassen. Typische Anwendungsfälle sind Session-Handling, Objekt-Caching, Rate-Limiting und das Reduzieren von Datenbanklasten in hochfrequentierten Anwendungen.
Im Vergleich zur älteren Memcache-Erweiterung bietet Memcached erweiterte Funktionen wie CAS (Check-And-Set), binäres Protokoll, SASL-Authentifizierung und effizientere Serialisierung. Die Klasse wird über den PECL-memcached-Paket bereitgestellt und benötigt libmemcached als Systemabhängigkeit.
Alle Schlüssel (Keys) unterliegen den Memcached-Beschränkungen: maximal 250 Zeichen, keine Leerzeichen oder Steuerzeichen. Werte können bis zu 1 MB groß sein (Standard), was sich per Serverkonfiguration anpassen lässt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $persistent_id | string | Optionaler Name für eine persistente Verbindung. Instanzen mit gleichem persistent_id teilen sich die Server-Pool-Konfiguration über mehrere Requests hinweg. Wird kein Wert übergeben, wird eine neue, nicht-persistente Verbindung erzeugt. |
Rückgabewert
Beispiele
Grundlegendes Caching: Datenbankabfrage zwischenspeichern
<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
$cacheKey = 'user_42_profile';
$userData = $mc->get($cacheKey);
if ($mc->getResultCode() === Memcached::RES_NOTFOUND) {
// Cache-Miss: Daten aus DB laden
$userData = ['id' => 42, 'name' => 'Max Mustermann', 'email' => 'max@example.com'];
// Für 5 Minuten (300 Sekunden) im Cache speichern
$mc->set($cacheKey, $userData, 300);
echo "Daten aus Datenbank geladen.\n";
} else {
echo "Daten aus Cache geladen.\n";
}
print_r($userData);
Persistente Verbindung mit mehreren Servern und CAS
<?php
// Persistente Verbindung: Server-Pool wird nur einmal konfiguriert
$mc = new Memcached('app_pool');
if (!$mc->getServerList()) {
$mc->addServers([
['cache1.example.com', 11211, 2], // Gewichtung 2
['cache2.example.com', 11211, 1], // Gewichtung 1
]);
$mc->setOption(Memcached::OPT_COMPRESSION, true);
$mc->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_JSON);
}
// CAS (Check-And-Set) für Race-Condition-sicheres Update
$casToken = null;
$value = $mc->get('page_views', null, $casToken);
if ($mc->getResultCode() === Memcached::RES_NOTFOUND) {
$mc->add('page_views', 1, 3600);
} else {
// Nur aktualisieren, wenn sich der Wert seit dem Lesen nicht geändert hat
$mc->cas($casToken, 'page_views', $value + 1, 3600);
}
echo "Seitenaufrufe: " . $mc->get('page_views');
Mehrere Schlüssel auf einmal lesen und schreiben (Multi-Get)
<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
// Mehrere Werte auf einmal setzen
$mc->setMulti([
'config_theme' => 'dark',
'config_language' => 'de',
'config_timezone' => 'Europe/Berlin',
], 3600);
// Mehrere Werte auf einmal abrufen
$keys = ['config_theme', 'config_language', 'config_timezone', 'config_missing'];
$results = $mc->getMulti($keys);
foreach ($keys as $key) {
$val = $results[$key] ?? '(nicht gefunden)';
echo "$key => $val\n";
}
// Wichtig · Fallstricke
Sicherheit: Memcached bietet standardmäßig keine Authentifizierung. Stelle sicher, dass der Memcached-Port (11211) niemals öffentlich erreichbar ist. Binde den Dienst ausschließlich an 127.0.0.1 oder nutze SASL-Authentifizierung über Memcached::OPT_BINARY_PROTOCOL und setSaslAuthData().
Sicherheitsrisiko Cache-Poisoning: Speichere keine sicherheitsrelevanten Daten (z. B. Passwörter, Tokens) unverschlüsselt im Cache. Stelle sicher, dass Cache-Schlüssel keine nutzergesteuerten Eingaben ohne Validierung enthalten, um Cache-Poisoning zu verhindern.
Serialisierung: Standardmäßig wird PHP's serialize() verwendet. Für bessere Performance und sprachenübergreifende Kompatibilität kann Memcached::SERIALIZER_JSON oder Memcached::SERIALIZER_IGBINARY gesetzt werden. Memcached::OPT_COMPRESSION aktiviert automatische zlib-Komprimierung bei großen Werten.
Fehlerbehandlung: Methoden geben bei Fehler false zurück. Den genauen Fehlercode erhält man via getResultCode(), den lesbaren Text via getResultMessage(). Verwende immer Memcached::RES_SUCCESS zum Vergleich statt true.