Start · Sprachen · PHP · Referenz · Swoole\Redis\Server

Swoole\Redis\Server

Klasse

Implementiert einen asynchronen, hochperformanten Server, der das Redis-Serialisierungsprotokoll (RESP) versteht und eigene Redis-kompatible Befehle bereitstellt.

seit PHP 4.0.0 Kategorie: misc

Signatur

class Swoole\Redis\Server extends Swoole\Server

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

Typ

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.