Start · Sprachen · PHP · Referenz · Memcached

Memcached

Klasse

Repräsentiert eine Verbindung zu einer Menge von Memcached-Servern und ermöglicht das Speichern, Abrufen und Verwalten von Daten im verteilten Cache.

seit PHP 2.0.0 Kategorie: db

Signatur

class Memcached

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

Typ

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);
Daten aus Datenbank geladen. Array ( [id] => 42 [name] => Max Mustermann [email] => max@example.com )

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');
Seitenaufrufe: 1

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";
}
config_theme => dark config_language => de config_timezone => Europe/Berlin config_missing => (nicht gefunden)

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