TrueAsync\HttpServer
(PHP 8.6+, true_async_server 0.6+)
Головний клас вбудованого сервера. Отримує конфіг через конструктор, приймає обробники протоколів, запускається через start() і блокує потік до 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
}Методи
__construct
public HttpServer::__construct(HttpServerConfig $config)Створює сервер із заданим конфігом. Конфіг заморожується на цьому виклику — наступні сетери кидають HttpServerRuntimeException.
addHttpHandler
public HttpServer::addHttpHandler(callable $handler): staticРеєструє обробник HTTP/1.1 і HTTP/2 запитів. Сигнатура:
function (HttpRequest $request, HttpResponse $response): voidКожен запит виконується у власній корутині в per-request scope. Обробник повертає void; відповідь надсилається через $response.
addStaticHandler
public HttpServer::addStaticHandler(StaticHandler $handler): staticРеєструє static-mount (issue #13). Запити під $handler->getUrlPrefix() обслуговуються повністю в C — без спавна корутини, без заходу в PHP VM.
Множинні mount'и матчаться в порядку реєстрації. Після attach handler блокується — будь-які сетери на ньому кидають HttpServerRuntimeException.
Див. StaticHandler.
addWebSocketHandler
public HttpServer::addWebSocketHandler(callable $handler): static📋 Заплановано. RFC 6455, upgrade з HTTP/1.1 і HTTP/2.
addHttp2Handler
public HttpServer::addHttp2Handler(callable $handler): static📋 Заплановано. Зараз HTTP/2 запити потрапляють у addHttpHandler (спільний H1/H2 диспетчер).
addGrpcHandler
public HttpServer::addGrpcHandler(callable $handler): static📋 Заплановано. Поверх HTTP/2, unary і streaming RPC.
start
public HttpServer::start(): boolЗапускає сервер і блокує потік, що викликає, до stop() або фатальної помилки.
- При
setWorkers(1)— крутить event-loop на потоці, що викликає. - При
setWorkers(N > 1)— спавнитьAsync\ThreadPoolз N воркерів іawaitить їх завершення.
Повертає true при штатній зупинці. Кидає HttpServerException (і нащадків) при помилках запуску (bind failed, відсутня потрібна збірка для HTTP/3 за наявності addHttp3Listener тощо).
stop
public HttpServer::stop(): boolGraceful shutdown:
- Припиняє приймання нових з'єднань.
- Чекає завершення активних запитів (до
setShutdownTimeout()). - Закриває всі з'єднання.
Повертає true при успішній зупинці.
Cross-thread
stop()— у roadmap. Зараз зупинку найчастіше ініціюють через SIGINT/SIGTERM.
isRunning
public HttpServer::isRunning(): boolgetConfig
public HttpServer::getConfig(): HttpServerConfigПовертає той самий об'єкт конфігу, що був переданий у __construct. Після старту сервера конфіг заблоковано (isLocked() === true).
getHttp3Stats
public HttpServer::getHttp3Stats(): arrayPer-listener observability для HTTP/3. Один запис на кожен addHttp3Listener() у порядку реєстрації. Кожен запис містить:
| Ключ | Значення |
|---|---|
host | прив'язаний host |
port | UDP-порт |
datagrams_received | лічильник прийнятих датаграм |
bytes_received | прийнято байтів |
datagrams_errored | датаграм з помилкою |
last_datagram_size | розмір останньої датаграми |
last_peer | останній peer (string) |
Повертає порожній масив, коли розширення зібрано без --enable-http3.
getRuntimeStats
public HttpServer::getRuntimeStats(): arraySnapshot внутрішніх алокаторів сервера. Допомагає атрибутувати зростання RSS на конкретні підсистеми.
| Ключ | Що означає |
|---|---|
conn_arena_live | http_connection_t слотів зараз у роботі (один на live TCP-connection) |
conn_arena_slots | всього слотів у чанках (live + free, не shrink'ається) |
conn_arena_chunks | скільки чанків закомічено; кожен — CONN_ARENA_CHUNK_SLOTS (256) структур по ~768 B |
conn_arena_bytes | chunks × 256 × sizeof(http_connection_t) — віртуальний commitment |
body_pool | per-size-class LIFO великих request-bodies (1 MB..128 MB). Кожен запис: slot_bytes, count, bytes |
body_pool_total_bytes | сума bytes по всіх класах |
getTelemetry
public HttpServer::getTelemetry(): array📋 Заплановано.
resetTelemetry
public HttpServer::resetTelemetry(): bool📋 Заплановано.
Приклад
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();