Signatur
Beschreibung
Swoole\Redis\Server erweitert Swoole\Server um die Fähigkeit, das Redis Serialization Protocol (RESP) nativ zu sprechen. Damit lässt sich ein eigener Redis-kompatibler Server implementieren, der von Standard-Redis-Clients (z. B. redis-cli, Predis, phpredis) angesteuert werden kann, ohne dass ein echter Redis-Prozess vorhanden sein muss.
Der Hauptanwendungsfall ist das Erstellen spezialisierter In-Memory-Datenspeicher, Proxys oder Test-Doubles, die das Redis-Protokoll sprechen, aber vollständig eigene Geschäftslogik implementieren. Befehle werden über setHandler() registriert; die Klasse übernimmt automatisch das RESP-Parsing eingehender Anfragen und das korrekte Serialisieren der Antworten.
Da die Klasse asynchron-eventgesteuert ist, kann sie tausende gleichzeitiger Verbindungen mit einem einzigen Worker-Prozess bedienen. Eigene Befehle werden analog zu Redis-Befehlen (z. B. GET, SET, HSET) als PHP-Callbacks hinterlegt. Für die Antwortkodierung stehen statische Hilfsmethoden wie Swoole\Redis\Server::format() bereit.
Achtung: Die Klasse ist Teil der Swoole-Extension und steht ausschließlich zur Verfügung, wenn Swoole installiert und aktiviert ist. Sie ersetzt keinen produktiven Redis-Server, sondern bietet einen Baukasten für protokollkompatible Spezialserver.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $host Pflicht | string | IP-Adresse oder Hostname, auf dem der Server lauscht, z. B. '0.0.0.0' für alle Interfaces oder '127.0.0.1' für Loopback. |
|
| $port Pflicht | int | TCP-Port, auf dem der Server lauscht. Standard-Redis-Port ist 6379; für Tests kann ein beliebiger freier Port gewählt werden. |
|
| $mode | int | SWOOLE_PROCESS | Betriebsmodus des Servers: SWOOLE_PROCESS (Multi-Prozess) oder SWOOLE_BASE (Single-Process). Beeinflusst Worker-Modell und Performance-Charakteristik. |
| $sock_type | int | SWOOLE_SOCK_TCP | Socket-Typ, standardmäßig SWOOLE_SOCK_TCP. Für Unix-Domain-Sockets kann SWOOLE_UNIX_STREAM verwendet werden. |
Rückgabewert
Beispiele
Minimaler Redis-kompatibler Server mit GET und SET
<?php
// Einfacher In-Memory-Key-Value-Store, der das Redis-Protokoll spricht
$store = [];
$server = new Swoole\Redis\Server('127.0.0.1', 6379);
// SET-Befehl registrieren
$server->setHandler('SET', function (Swoole\Server\Response $response, array $params) use (&$store) {
if (count($params) < 2) {
return $response->send(Swoole\Redis\Server::format(Swoole\Redis\Server::ERROR, 'ERR wrong number of arguments'));
}
$store[$params[0]] = $params[1];
return $response->send(Swoole\Redis\Server::format(Swoole\Redis\Server::STATUS, 'OK'));
});
// GET-Befehl registrieren
$server->setHandler('GET', function (Swoole\Server\Response $response, array $params) use (&$store) {
if (count($params) < 1) {
return $response->send(Swoole\Redis\Server::format(Swoole\Redis\Server::ERROR, 'ERR wrong number of arguments'));
}
$value = $store[$params[0]] ?? null;
if ($value === null) {
return $response->send(Swoole\Redis\Server::format(Swoole\Redis\Server::NIL));
}
return $response->send(Swoole\Redis\Server::format(Swoole\Redis\Server::BULK, $value));
});
$server->start();
// Nun kann ein Redis-Client verbinden:
// $ redis-cli -p 6379 SET foo bar
// $ redis-cli -p 6379 GET foo
Antwortformate mit Swoole\Redis\Server::format()
<?php
// Demonstration der format()-Hilfsmethode für alle RESP-Typen
// Einfacher Status (z. B. OK)
$ok = Swoole\Redis\Server::format(Swoole\Redis\Server::STATUS, 'OK');
echo bin2hex($ok) . PHP_EOL; // +OK\r\n
// Fehlermeldung
$err = Swoole\Redis\Server::format(Swoole\Redis\Server::ERROR, 'ERR unknown command');
echo bin2hex($err) . PHP_EOL; // -ERR unknown command\r\n
// Integer-Antwort
$int = Swoole\Redis\Server::format(Swoole\Redis\Server::INT, 42);
echo bin2hex($int) . PHP_EOL; // :42\r\n
// Bulk-String
$bulk = Swoole\Redis\Server::format(Swoole\Redis\Server::BULK, 'Hello World');
echo bin2hex($bulk) . PHP_EOL; // $11\r\nHello World\r\n
// Nil / Null-Bulk-String
$nil = Swoole\Redis\Server::format(Swoole\Redis\Server::NIL);
echo bin2hex($nil) . PHP_EOL; // $-1\r\n
// Multi-Bulk / Array
$multi = Swoole\Redis\Server::format(Swoole\Redis\Server::MULTI_BULK, ['alpha', 'beta', 'gamma']);
echo $multi;
// Wichtig · Fallstricke
Swoole-Abhängigkeit: Swoole\Redis\Server setzt eine installierte und aktivierte Swoole-PHP-Extension voraus. In Standard-PHP-Umgebungen ohne Swoole ist die Klasse nicht verfügbar.
Nebenläufigkeit: Gemeinsam genutzter Zustand (z. B. der $store-Array) muss bei mehreren Worker-Prozessen über Swoole\Table oder andere IPC-Mechanismen geteilt werden — einfache PHP-Variablen sind pro-Worker-Prozess lokal.
Kein vollständiger Redis-Ersatz: Die Klasse implementiert kein Persistenz-Layer, keine Replikation und keine Pub/Sub-Infrastruktur out-of-the-box. Sie ist ein Protokoll-Framework, nicht ein Feature-kompletter Redis-Server.
Sicherheit: Ohne Authentifizierungslogik (analoge AUTH-Handler) ist der Server für alle erreichbaren Clients offen. In Produktionsumgebungen immer Firewall-Regeln oder einen eigenen AUTH-Handler implementieren.