TrueAsync\HttpServer
(PHP 8.6+, true_async_server 0.6+)
Hauptklasse des integrierten Servers. Erhält die Konfiguration über den Konstruktor, nimmt Protokoll-Handler entgegen, wird über start() gestartet und blockiert den Thread bis stop().
namespace TrueAsync;
final class HttpServer
{
public function __construct(HttpServerConfig $config);
public function addHttpHandler(callable $handler): static;
public function addStaticHandler(StaticHandler $handler): static;
public function addWebSocketHandler(callable $handler): static; // TODO
public function addHttp2Handler(callable $handler): static; // TODO
public function addGrpcHandler(callable $handler): static; // TODO
public function start(): bool;
public function stop(): bool;
public function isRunning(): bool;
public function getConfig(): HttpServerConfig;
public function getHttp3Stats(): array;
public function getRuntimeStats(): array;
public function getTelemetry(): array; // TODO
public function resetTelemetry(): bool; // TODO
}Methoden
__construct
public HttpServer::__construct(HttpServerConfig $config)Erstellt einen Server mit der angegebenen Konfiguration. Die Konfiguration wird bei diesem Aufruf eingefroren — nachfolgende Setter werfen HttpServerRuntimeException.
addHttpHandler
public HttpServer::addHttpHandler(callable $handler): staticRegistriert einen Handler für HTTP/1.1- und HTTP/2-Anfragen. Signatur:
function (HttpRequest $request, HttpResponse $response): voidJede Anfrage läuft in einer eigenen Coroutine im Per-Request Scope. Der Handler gibt void zurück; die Antwort wird über $response gesendet.
addStaticHandler
public HttpServer::addStaticHandler(StaticHandler $handler): staticRegistriert einen Static-Mount (Issue #13). Anfragen unter $handler->getUrlPrefix() werden vollständig in C bedient — ohne Coroutine-Spawn, ohne Eintritt in die PHP-VM.
Mehrere Mounts werden in Registrierungsreihenfolge gematcht. Nach dem Attach wird der Handler gesperrt — jeder Setter darauf wirft HttpServerRuntimeException.
Siehe StaticHandler.
addWebSocketHandler
public HttpServer::addWebSocketHandler(callable $handler): static📋 Geplant. RFC 6455, Upgrade von HTTP/1.1 und HTTP/2.
addHttp2Handler
public HttpServer::addHttp2Handler(callable $handler): static📋 Geplant. Aktuell landen HTTP/2-Anfragen in addHttpHandler (gemeinsamer H1/H2-Dispatcher).
addGrpcHandler
public HttpServer::addGrpcHandler(callable $handler): static📋 Geplant. Über HTTP/2, unary und streaming RPC.
start
public HttpServer::start(): boolStartet den Server und blockiert den aufrufenden Thread bis stop() oder ein fataler Fehler.
- Bei
setWorkers(1)— Event-Loop läuft auf dem aufrufenden Thread. - Bei
setWorkers(N > 1)— spawntAsync\ThreadPoolmit N Workern undawaitet deren Ende.
Liefert true bei regulärem Stop. Wirft HttpServerException (und Subklassen) bei Startfehlern (Bind failed, fehlender HTTP/3-Build, wenn addHttp3Listener vorhanden ist, etc.).
stop
public HttpServer::stop(): boolGraceful Shutdown:
- Stoppt die Annahme neuer Verbindungen.
- Wartet auf das Ende aktiver Anfragen (bis
setShutdownTimeout()). - Schließt alle Verbindungen.
Liefert true bei erfolgreichem Stop.
Cross-Thread-
stop()— in der Roadmap. Derzeit wird der Stop meistens über SIGINT/SIGTERM ausgelöst.
isRunning
public HttpServer::isRunning(): boolgetConfig
public HttpServer::getConfig(): HttpServerConfigLiefert dasselbe Config-Objekt, das in __construct übergeben wurde. Nach dem Server-Start ist die Konfiguration gesperrt (isLocked() === true).
getHttp3Stats
public HttpServer::getHttp3Stats(): arrayPer-Listener-Observability für HTTP/3. Ein Eintrag pro addHttp3Listener() in Registrierungsreihenfolge. Jeder Eintrag enthält:
| Schlüssel | Wert |
|---|---|
host | gebundener Host |
port | UDP-Port |
datagrams_received | Zähler eingegangener Datagramme |
bytes_received | empfangene Bytes |
datagrams_errored | Datagramme mit Fehler |
last_datagram_size | Größe des letzten Datagramms |
last_peer | letzter Peer (string) |
Liefert ein leeres Array, wenn die Extension ohne --enable-http3 gebaut wurde.
getRuntimeStats
public HttpServer::getRuntimeStats(): arraySnapshot der internen Server-Allokatoren. Hilft, RSS-Wachstum konkreten Subsystemen zuzuordnen.
| Schlüssel | Bedeutung |
|---|---|
conn_arena_live | aktuell genutzte http_connection_t-Slots (einer pro Live-TCP-Connection) |
conn_arena_slots | Gesamtzahl Slots in den Chunks (live + free, kein Shrink) |
conn_arena_chunks | committeerte Chunks; jeder = CONN_ARENA_CHUNK_SLOTS (256) Structs à ~768 B |
conn_arena_bytes | chunks × 256 × sizeof(http_connection_t) — virtuelles Commitment |
body_pool | Per-Size-Class LIFO für große Request-Bodies (1 MB..128 MB). Jeder Eintrag: slot_bytes, count, bytes |
body_pool_total_bytes | Summe bytes über alle Klassen |
getTelemetry
public HttpServer::getTelemetry(): array📋 Geplant.
resetTelemetry
public HttpServer::resetTelemetry(): bool📋 Geplant.
Beispiel
use TrueAsync\HttpServer;
use TrueAsync\HttpServerConfig;
use TrueAsync\StaticHandler;
$server = new HttpServer(
(new HttpServerConfig())
->addListener('0.0.0.0', 8080)
->setWorkers(4)
);
$server->addStaticHandler(
(new StaticHandler('/assets/', __DIR__ . '/public'))
->enablePrecompressed('br', 'gzip')
);
$server->addHttpHandler(function ($req, $res) {
$res->json(['ok' => true, 'path' => $req->getPath()]);
});
$server->start();