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

Swoole\Http\Server

Klasse

Implementiert einen hochperformanten, asynchronen HTTP-Server auf Basis der Swoole-Extension, der eingehende HTTP-Anfragen nicht-blockierend verarbeitet.

seit PHP 1.9.0 Kategorie: misc

Signatur

class Swoole\Http\Server extends Swoole\Server

Beschreibung

Swoole\Http\Server ist eine spezialisierte Unterklasse von Swoole\Server, die das HTTP-Protokoll nativ versteht. Anders als klassische PHP-Prozessmodelle (FPM, Apache mod_php) läuft der Server als dauerhafter Prozess im Speicher. Eingehende HTTP-Requests werden asynchron und event-getrieben abgearbeitet, was einen erheblich geringeren Overhead pro Request bedeutet und sehr hohe Durchsatzraten ermöglicht.

Der Server registriert einen request-Callback, der für jede eingehende HTTP-Anfrage aufgerufen wird. Dieser erhält zwei Objekte: ein Swoole\Http\Request-Objekt mit allen Anfragedaten (Header, GET/POST-Parameter, Cookies, Body) sowie ein Swoole\Http\Response-Objekt zum Senden der Antwort. Das Objekt muss am Ende des Callbacks durch Aufruf von $response->end() abgeschlossen werden.

Typische Einsatzgebiete sind APIs mit hohem Durchsatz, Microservices, WebSocket-Server mit gleichzeitiger HTTP-Unterstützung, sowie Echtzeit-Anwendungen. Da der Prozess dauerhaft läuft, bleiben Datenbankverbindungen und Caches zwischen Requests erhalten – was Performance bringt, aber auch besondere Sorgfalt bei globalen Zuständen erfordert.

Die Klasse unterstützt HTTP/1.1 (Keep-Alive, Chunked Transfer), kann mit Swoole\Http\Server in Kombination mit Swoole\WebSocket\Server erweitert werden, und bietet zahlreiche Konfigurationsoptionen wie SSL/TLS, Worker-Prozessanzahl und Request-Timeouts via set().

Parameter

Name Typ Default Beschreibung
$host Pflicht string Die IP-Adresse oder der Hostname, auf der der Server lauscht, z. B. '0.0.0.0' für alle Interfaces oder '127.0.0.1' für localhost.
$port Pflicht int Der TCP-Port, auf dem der HTTP-Server auf eingehende Verbindungen wartet, z. B. 9501. Ports unter 1024 erfordern Root-Rechte.
$mode int SWOOLE_PROCESS Der Betriebsmodus des Servers. Mögliche Werte: SWOOLE_PROCESS (Standard, mehrere Worker-Prozesse) oder SWOOLE_BASE (reaktives Modell, ein Event-Loop pro Worker).
$sock_type int SWOOLE_SOCK_TCP Der Socket-Typ. Für HTTPS/SSL wird SWOOLE_SOCK_TCP | SWOOLE_SSL verwendet. Standard ist SWOOLE_SOCK_TCP für normales HTTP.

Beispiele

Minimaler HTTP-Server mit 'Hello World'

<?php
// Swoole-Extension muss installiert und geladen sein
$server = new Swoole\Http\Server('0.0.0.0', 9501);

$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
    // Einfachen Text-Response senden
    $response->header('Content-Type', 'text/plain; charset=utf-8');
    $response->status(200);
    $response->end('Hallo Welt! Pfad: ' . $request->server['request_uri']);
});

echo "HTTP-Server läuft auf http://0.0.0.0:9501\n";
$server->start();
HTTP-Server läuft auf http://0.0.0.0:9501

HTTP-Server mit mehreren Worker-Prozessen, JSON-API und POST-Verarbeitung

<?php
$server = new Swoole\Http\Server('127.0.0.1', 9502);

// Konfiguration: 4 Worker, statische Dateien aus /var/www/public
$server->set([
    'worker_num'        => 4,
    'document_root'     => '/var/www/public',
    'enable_static_handler' => true,
    'max_request'       => 1000,
]);

$server->on('workerStart', function (Swoole\Http\Server $server, int $workerId) {
    echo "Worker #{$workerId} gestartet\n";
});

$server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
    $uri = $request->server['request_uri'] ?? '/';
    $method = $request->server['request_method'];

    // Einfaches Routing
    if ($uri === '/api/echo' && $method === 'POST') {
        $body = json_decode($request->rawContent(), true);
        $response->header('Content-Type', 'application/json');
        $response->end(json_encode([
            'status'  => 'ok',
            'empfangen' => $body,
        ]));
        return;
    }

    if ($uri === '/api/info') {
        $response->header('Content-Type', 'application/json');
        $response->end(json_encode([
            'php'    => PHP_VERSION,
            'swoole' => SWOOLE_VERSION,
            'get'    => $request->get ?? [],
        ]));
        return;
    }

    // 404-Fallback
    $response->status(404);
    $response->end(json_encode(['error' => 'Route nicht gefunden']));
});

$server->on('shutdown', function () {
    echo "Server wurde beendet.\n";
});

echo "API-Server läuft auf http://127.0.0.1:9502\n";
$server->start();
API-Server läuft auf http://127.0.0.1:9502 Worker #0 gestartet Worker #1 gestartet Worker #2 gestartet Worker #3 gestartet

HTTPS-Server mit SSL-Zertifikat

<?php
$server = new Swoole\Http\Server(
    '0.0.0.0',
    443,
    SWOOLE_PROCESS,
    SWOOLE_SOCK_TCP | SWOOLE_SSL
);

$server->set([
    'ssl_cert_file' => '/etc/ssl/certs/server.crt',
    'ssl_key_file'  => '/etc/ssl/private/server.key',
    'worker_num'    => 2,
]);

$server->on('request', function (Swoole\Http\Request $req, Swoole\Http\Response $res) {
    $res->header('Strict-Transport-Security', 'max-age=31536000');
    $res->end('<h1>Sicherer Swoole-Server</h1>');
});

$server->start();

// Wichtig · Fallstricke

Globaler Zustand: Da Worker-Prozesse dauerhaft laufen, teilen sich alle Requests innerhalb eines Workers globale Variablen, statische Klasseneigenschaften und externe Verbindungsobjekte. Werte, die zwischen Requests nicht geteilt werden sollen, müssen am Requestende explizit zurückgesetzt werden. Nicht thread-sichere Extensions oder globale PHP-Superglobale können sich unerwartet verhalten.

$response->end() ist zwingend erforderlich: Jeder Request-Callback muss $response->end() aufrufen – auch im Fehlerfall. Wird dies vergessen, bleibt die Verbindung offen und belegt Ressourcen, bis ein Timeout greift.

Sicherheit: Der Server bietet keine eingebaute Absicherung gegen gängige Angriffe (XSS, CSRF, SQL-Injection). Diese Maßnahmen müssen vollständig in der Anwendungsschicht implementiert werden. Für produktive Deployments empfiehlt sich die Verwendung eines Reverse-Proxy (nginx) vor dem Swoole-Server.

Coroutinen: Ab Swoole 4.x können innerhalb des request-Callbacks Coroutinen verwendet werden, um asynchrone I/O-Operationen (Datenbank, HTTP-Client etc.) non-blockierend auszuführen. Dazu muss die entsprechende Coroutinen-Unterstützung der verwendeten Clients sichergestellt sein.