TrueAsync\HttpServer

(PHP 8.6+, true_async_server 0.6+)

Головний клас вбудованого сервера. Отримує конфіг через конструктор, приймає обробники протоколів, запускається через start() і блокує потік до stop().

php
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
}

Методи

__construct

php
public HttpServer::__construct(HttpServerConfig $config)

Створює сервер із заданим конфігом. Конфіг заморожується на цьому виклику — наступні сетери кидають HttpServerRuntimeException.

addHttpHandler

php
public HttpServer::addHttpHandler(callable $handler): static

Реєструє обробник HTTP/1.1 і HTTP/2 запитів. Сигнатура:

php
function (HttpRequest $request, HttpResponse $response): void

Кожен запит виконується у власній корутині в per-request scope. Обробник повертає void; відповідь надсилається через $response.

addStaticHandler

php
public HttpServer::addStaticHandler(StaticHandler $handler): static

Реєструє static-mount (issue #13). Запити під $handler->getUrlPrefix() обслуговуються повністю в C — без спавна корутини, без заходу в PHP VM.

Множинні mount'и матчаться в порядку реєстрації. Після attach handler блокується — будь-які сетери на ньому кидають HttpServerRuntimeException.

Див. StaticHandler.

addWebSocketHandler

php
public HttpServer::addWebSocketHandler(callable $handler): static

📋 Заплановано. RFC 6455, upgrade з HTTP/1.1 і HTTP/2.

addHttp2Handler

php
public HttpServer::addHttp2Handler(callable $handler): static

📋 Заплановано. Зараз HTTP/2 запити потрапляють у addHttpHandler (спільний H1/H2 диспетчер).

addGrpcHandler

php
public HttpServer::addGrpcHandler(callable $handler): static

📋 Заплановано. Поверх HTTP/2, unary і streaming RPC.

start

php
public HttpServer::start(): bool

Запускає сервер і блокує потік, що викликає, до stop() або фатальної помилки.

  • При setWorkers(1) — крутить event-loop на потоці, що викликає.
  • При setWorkers(N > 1) — спавнить Async\ThreadPool з N воркерів і awaitить їх завершення.

Повертає true при штатній зупинці. Кидає HttpServerException (і нащадків) при помилках запуску (bind failed, відсутня потрібна збірка для HTTP/3 за наявності addHttp3Listener тощо).

stop

php
public HttpServer::stop(): bool

Graceful shutdown:

  1. Припиняє приймання нових з'єднань.
  2. Чекає завершення активних запитів (до setShutdownTimeout()).
  3. Закриває всі з'єднання.

Повертає true при успішній зупинці.

Cross-thread stop() — у roadmap. Зараз зупинку найчастіше ініціюють через SIGINT/SIGTERM.

isRunning

php
public HttpServer::isRunning(): bool

getConfig

php
public HttpServer::getConfig(): HttpServerConfig

Повертає той самий об'єкт конфігу, що був переданий у __construct. Після старту сервера конфіг заблоковано (isLocked() === true).

getHttp3Stats

php
public HttpServer::getHttp3Stats(): array

Per-listener observability для HTTP/3. Один запис на кожен addHttp3Listener() у порядку реєстрації. Кожен запис містить:

КлючЗначення
hostприв'язаний host
portUDP-порт
datagrams_receivedлічильник прийнятих датаграм
bytes_receivedприйнято байтів
datagrams_erroredдатаграм з помилкою
last_datagram_sizeрозмір останньої датаграми
last_peerостанній peer (string)

Повертає порожній масив, коли розширення зібрано без --enable-http3.

getRuntimeStats

php
public HttpServer::getRuntimeStats(): array

Snapshot внутрішніх алокаторів сервера. Допомагає атрибутувати зростання RSS на конкретні підсистеми.

КлючЩо означає
conn_arena_livehttp_connection_t слотів зараз у роботі (один на live TCP-connection)
conn_arena_slotsвсього слотів у чанках (live + free, не shrink'ається)
conn_arena_chunksскільки чанків закомічено; кожен — CONN_ARENA_CHUNK_SLOTS (256) структур по ~768 B
conn_arena_byteschunks × 256 × sizeof(http_connection_t) — віртуальний commitment
body_poolper-size-class LIFO великих request-bodies (1 MB..128 MB). Кожен запис: slot_bytes, count, bytes
body_pool_total_bytesсума bytes по всіх класах

getTelemetry

php
public HttpServer::getTelemetry(): array

📋 Заплановано.

resetTelemetry

php
public HttpServer::resetTelemetry(): bool

📋 Заплановано.

Приклад

php
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();

Див. також