TrueAsync\HttpServerConfig
(PHP 8.6+, true_async_server 0.6+)
Конфігурація сервера. Усі методи — fluent (повертають static). Після передачі об'єкта в new HttpServer($config) конфіг заморожується: будь-який сетер кидає HttpServerRuntimeException. Перевірити — isLocked().
Див. також Конфігурація — покроковий гайд.
Конструктор
__construct
public HttpServerConfig::__construct(?string $host = null, int $port = 8080)Необов'язкові параметри — shortcut на single-listener. Частіше використовується без аргументів плюс addListener().
Listeners
addListener
public HttpServerConfig::addListener(string $host, int $port, bool $tls = false): staticTCP-listener, що приймає HTTP/1.1 і HTTP/2 (h2c через preface detection на plaintext, h2 через ALPN на TLS).
addHttp1Listener
public HttpServerConfig::addHttp1Listener(string $host, int $port, bool $tls = false): staticHTTP/1.1-only TCP-listener. З'єднання з HTTP/2 preface віддається в llhttp, який емітує compliant 400 Bad Request і закривається.
addHttp2Listener
public HttpServerConfig::addHttp2Listener(string $host, int $port, bool $tls = false): staticHTTP/2-only listener.
$tls=false: h2c (cleartext H2). Listener вимагає RFC 7540 §3.5 preface; усе інше потрапляє вBAD_CLIENT_MAGICnghttp2 і отримує compliantGOAWAY(PROTOCOL_ERROR).$tls=true: сервер анонсує через ALPN лишеh2.
addUnixListener
public HttpServerConfig::addUnixListener(string $path): staticUnix-socket listener (H1 + H2, стиль h2c).
addHttp3Listener
public HttpServerConfig::addHttp3Listener(string $host, int $port): staticHTTP/3 / QUIC over UDP. TLS 1.3 обов'язковий — береться сертифікат сервера, окремого $tls-прапорця немає. Розширення має бути зібрано з --enable-http3, інакше start() кине виняток.
getListeners
public HttpServerConfig::getListeners(): arrayМасив усіх зареєстрованих listeners.
Connection limits
setBacklog / getBacklog
public HttpServerConfig::setBacklog(int $backlog): static
public HttpServerConfig::getBacklog(): intSocket backlog. Дефолт 128.
setWorkers / getWorkers
public HttpServerConfig::setWorkers(int $workers): static
public HttpServerConfig::getWorkers(): intРозмір вбудованого worker-pool'а (issue #11).
1(дефолт) — single-threaded.> 1—start()спавнитьAsync\ThreadPoolуказаного розміру, конфіг + handler-set реплікуються черезtransfer_obj, батько чекає завершення всіх воркерів. Кожен воркер re-bind'ить listeners; ядро балансує accept черезSO_REUSEPORT(Linux/BSD).
setBootloader / getBootloader
public HttpServerConfig::setBootloader(?\Closure $bootloader): static
public HttpServerConfig::getBootloader(): ?\ClosurePer-worker startup hook. Пул deep-copy'ить замикання один раз і запускає в кожному воркері перед task-loop'ом — ідеальне місце для autoload, прогріву пулів з'єднань, прекомпіляції opcache.
Застосовується лише при setWorkers() > 1. Виняток з bootloader фейлить увесь пул. Потребує TrueAsync ABI v0.15+.
setMaxConnections / getMaxConnections
public HttpServerConfig::setMaxConnections(int $maxConnections): static
public HttpServerConfig::getMaxConnections(): intЖорстка межа concurrent connections. 0 — без обмежень.
setMaxInflightRequests / getMaxInflightRequests
public HttpServerConfig::setMaxInflightRequests(int $n): static
public HttpServerConfig::getMaxInflightRequests(): intAdmission control: при досягненні ліміту нові запити отримують швидку відмову — H1 → 503 + Retry-After: 1, H2 → RST_STREAM REFUSED_STREAM (retry-safe за RFC 7540 §8.1.4). 0 — disabled (default); якщо 0 лишається на start(), ліміт виводиться як max_connections × 10.
Таймаути
| Метод | Що таймаутить |
|---|---|
setReadTimeout(int) / getReadTimeout(): int | приймання запиту |
setWriteTimeout(int) / getWriteTimeout(): int | надсилання відповіді |
setKeepAliveTimeout(int) / getKeepAliveTimeout(): int | idle між запитами; 0 — вимкнути keep-alive |
setShutdownTimeout(int) / getShutdownTimeout(): int | скільки чекати активні запити при graceful shutdown |
Значення в секундах. 0 (де застосовно) — вимкнення.
Backpressure (CoDel)
setBackpressureTargetMs / getBackpressureTargetMs
public HttpServerConfig::setBackpressureTargetMs(int $ms): static
public HttpServerConfig::getBackpressureTargetMs(): intTarget sojourn для CoDel. Коли per-request queue-wait тримається вище порогу 100 ms поспіль, listen-сокет ставиться на паузу. Діапазон 0..10_000, дефолт 5. 0 — вимкнути CoDel.
Guidance:
- швидкі обробники (<5 ms) — дефолт 5
- типовий web — 10..20
- повільні (БД, IO) — 50..100
Graceful drain (Step 8)
setMaxConnectionAgeMs / getMaxConnectionAgeMs
public HttpServerConfig::setMaxConnectionAgeMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeMs(): intПісля (age ± 10% jitter) lifetime — H1 наступна відповідь з Connection: close, H2 — GOAWAY. Аналог gRPC MAX_CONNECTION_AGE. Дефолт 0 (off); production-рекомендація 600_000 (10 хв) за L4 LB. Має бути 0 або ≥ 1000.
setMaxConnectionAgeGraceMs / getMaxConnectionAgeGraceMs
public HttpServerConfig::setMaxConnectionAgeGraceMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeGraceMs(): intHard-close після Connection: close/GOAWAY. 0 — без force-close таймера; non-zero ≥ 1000.
setDrainSpreadMs / getDrainSpreadMs
public HttpServerConfig::setDrainSpreadMs(int $ms): static
public HttpServerConfig::getDrainSpreadMs(): intВікно рівномірного спреду per-connection drain при CoDel-trip / hard-cap (анти-thundering-herd). Аналог HAProxy close-spread-time. Дефолт 5000, ≥ 100.
setDrainCooldownMs / getDrainCooldownMs
public HttpServerConfig::setDrainCooldownMs(int $ms): static
public HttpServerConfig::getDrainCooldownMs(): intМінімальний gap між реактивними drain-тригерами. Тригери всередині cooldown інкрементять telemetry counter. Дефолт 10_000, ≥ 1000.
HTTP/2 streaming
setStreamWriteBufferBytes / getStreamWriteBufferBytes
public HttpServerConfig::setStreamWriteBufferBytes(int $bytes): static
public HttpServerConfig::getStreamWriteBufferBytes(): intPer-stream chunk-queue cap для backpressure'а HttpResponse::send(). HTTP/2 only; HTTP/1 chunked використовує kernel send-buffer.
Дефолт 262_144 (256 KiB). Діапазон 4_096..67_108_864 (64 MiB).
Industry baseline: gRPC-Go 64 KiB, Envoy 1 MiB, Node.js 16 KiB.
setH2StaticBudgetMax / getH2StaticBudgetMax
public HttpServerConfig::setH2StaticBudgetMax(int $bytes): static
public HttpServerConfig::getH2StaticBudgetMax(): intPer-worker cap для HTTP/2 static-file body buffers (read-ahead chunks + ring queues). 0 — auto (memory_limit / 8). Будь-яке явне значення clamps так, щоб static budget не перевищував memory_limit мінус невеликий резерв.
Body limits
setMaxBodySize / getMaxBodySize
public HttpServerConfig::setMaxBodySize(int $bytes): static
public HttpServerConfig::getMaxBodySize(): intМаксимум на тіло запиту (H1 і H2). H1 — 413 + close; H2 — RST_STREAM(INTERNAL_ERROR) (connection лишається для інших streams).
Дефолт 10_485_760 (10 MiB). Діапазон 1_024..17_179_869_184 (16 GiB).
HTTP/3 knobs
setHttp3IdleTimeoutMs / getHttp3IdleTimeoutMs
public HttpServerConfig::setHttp3IdleTimeoutMs(int $ms): static
public HttpServerConfig::getHttp3IdleTimeoutMs(): intQUIC max_idle_timeout (RFC 9000 §10.1). Дефолт 30_000 (30 с). Діапазон 0..UINT32_MAX (~49 днів); 0 анонсує "no idle timeout". Legacy env PHP_HTTP3_IDLE_TIMEOUT_MS усе ще працює як ops escape hatch.
setHttp3StreamWindowBytes / getHttp3StreamWindowBytes
public HttpServerConfig::setHttp3StreamWindowBytes(int $bytes): static
public HttpServerConfig::getHttp3StreamWindowBytes(): intPer-stream QUIC flow-control window. Виставляє всі три: initial_max_stream_data_bidi_local, _bidi_remote, _uni (стиль h2o http3-input-window-size). Connection-level initial_max_data виводиться як window × max_concurrent_streams (патерн nginx).
Дефолт 262_144 (256 KiB). Діапазон 1_024..1_073_741_824 (1 GiB).
setHttp3MaxConcurrentStreams / getHttp3MaxConcurrentStreams
public HttpServerConfig::setHttp3MaxConcurrentStreams(int $n): static
public HttpServerConfig::getHttp3MaxConcurrentStreams(): intQUIC initial_max_streams_bidi. Аналог nginx http3_max_concurrent_streams. Дефолт 100, діапазон 1..1_000_000.
setHttp3PeerConnectionBudget / getHttp3PeerConnectionBudget
public HttpServerConfig::setHttp3PeerConnectionBudget(int $n): static
public HttpServerConfig::getHttp3PeerConnectionBudget(): intPer-source-IP cap на concurrent QUIC connections. Захист від handshake slow-loris і amplification. Дефолт 16, діапазон 1..4_096. Legacy env PHP_HTTP3_PEER_BUDGET усе ще override'ить на listener spawn.
setHttp3AltSvcEnabled / isHttp3AltSvcEnabled
public HttpServerConfig::setHttp3AltSvcEnabled(bool $enable): static
public HttpServerConfig::isHttp3AltSvcEnabled(): boolRFC 7838 Alt-Svc: h3=":<port>"; ma=86400 на H1/H2 відповідях при піднятому H3 listener. Дефолт true. Вимикайте на phased H3 rollout. Legacy env PHP_HTTP3_DISABLE_ALT_SVC honor'иться на start().
Стиснення
setCompressionEnabled / isCompressionEnabled
public HttpServerConfig::setCompressionEnabled(bool $enable): static
public HttpServerConfig::isCompressionEnabled(): boolMaster switch. Дефолт true. Якщо розширення зібрано без --enable-http-compression, приймається лише false — true кидає.
setCompressionLevel / getCompressionLevel
public HttpServerConfig::setCompressionLevel(int $level): static
public HttpServerConfig::getCompressionLevel(): intgzip level. zlib-семантика: 1 — найшвидший/слабший, 9 — повільний/сильний. Дефолт 6.
setBrotliLevel / getBrotliLevel
public HttpServerConfig::setBrotliLevel(int $level): static
public HttpServerConfig::getBrotliLevel(): intBrotli quality. Діапазон 0..11. Дефолт 4 (production-typical; quality 11 ≈ 50× повільніше за quality 4 з маргінальним виграшем по ratio).
Inert, якщо розширення зібрано без --enable-brotli — пайплайн відповіді ніколи не обере Brotli без HAVE_HTTP_BROTLI, що б сюди не передали.
setZstdLevel / getZstdLevel
public HttpServerConfig::setZstdLevel(int $level): static
public HttpServerConfig::getZstdLevel(): intzstd level. Діапазон 1..22. Дефолт 3 — production-default команди zstd (краще ratio за gzip-6 на більшій throughput).
setCompressionMinSize / getCompressionMinSize
public HttpServerConfig::setCompressionMinSize(int $bytes): static
public HttpServerConfig::getCompressionMinSize(): intBody-size threshold — нижче цього не стискаємо. Дефолт 1024 (1 KiB). Діапазон 0..16 MiB.
setCompressionMimeTypes / getCompressionMimeTypes
public HttpServerConfig::setCompressionMimeTypes(array $types): static
public HttpServerConfig::getCompressionMimeTypes(): arrayMIME-whitelist для стиснення. Повністю замінює дефолт (nginx gzip_types-семантика). Записи нормалізуються на setter: параметри (; charset=...) обрізаються, пробіли trim'ляться, все в lowercase.
Дефолт: ["application/javascript", "application/json", "application/xml", "image/svg+xml", "text/css", "text/html", "text/javascript", "text/plain", "text/xml"].
setRequestMaxDecompressedSize / getRequestMaxDecompressedSize
public HttpServerConfig::setRequestMaxDecompressedSize(int $bytes): static
public HttpServerConfig::getRequestMaxDecompressedSize(): intAnti-zip-bomb cap на декодовані тіла (Content-Encoding: gzip/br/zstd inbound). При перевищенні — 413. 0 вимикає cap (явно — implicit-unlimited не передбачено). Дефолт 10_485_760 (10 MiB).
getSupportedEncodings (static)
public static HttpServerConfig::getSupportedEncodings(): arrayСписок кодеків, вкомпільованих у цю збірку, в порядку переваги сервера. Завжди містить "identity"; "gzip" — при успішному --enable-http-compression; "br" / "zstd" — за наявності відповідної бібліотеки на configure-time.
Buffers
setWriteBufferSize / getWriteBufferSize
public HttpServerConfig::setWriteBufferSize(int $size): static
public HttpServerConfig::getWriteBufferSize(): intРозмір write-buffer'а.
Protocol options
| Метод | Призначення |
|---|---|
enableHttp2(bool) / isHttp2Enabled(): bool | toggle HTTP/2 (TODO) |
enableWebSocket(bool) / isWebSocketEnabled(): bool | toggle WS (TODO) |
enableProtocolDetection(bool) / isProtocolDetectionEnabled(): bool | автодетект протоколу на listener'і |
TLS
| Метод | Призначення |
|---|---|
enableTls(bool) / isTlsEnabled(): bool | toggle TLS на дефолтному listener'і |
setCertificate(string) / getCertificate(): ?string | шлях до PEM-сертифіката |
setPrivateKey(string) / getPrivateKey(): ?string | шлях до PEM-ключа |
Body handling
setAutoAwaitBody / isAutoAwaitBodyEnabled
public HttpServerConfig::setAutoAwaitBody(bool $enable): static
public HttpServerConfig::isAutoAwaitBodyEnabled(): boolКоли true, non-multipart запити чекають повного тіла до виклику обробника. Multipart завжди стрім. Дефолт true.
setBodyStreamingEnabled / isBodyStreamingEnabled
public HttpServerConfig::setBodyStreamingEnabled(bool $enabled): static
public HttpServerConfig::isBodyStreamingEnabled(): boolСтрім тіл запитів у per-request queue (issue #26) замість акумуляції в req->body. Обробники мають читати через HttpRequest::readBody(); getBody() кидає.
JSON
setJsonEncodeFlags / getJsonEncodeFlags
public HttpServerConfig::setJsonEncodeFlags(int $flags): static
public HttpServerConfig::getJsonEncodeFlags(): intДефолтні JSON_*-прапорці для HttpResponse::json(), коли per-call $flags=0 (або omit).
Дефолт: JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES.
JSON_THROW_ON_ERROR мовчки стрипається — помилка encode дає 500 JSON-помилки, виняток не пробрасується.
Logging / telemetry
setLogSeverity / getLogSeverity
public HttpServerConfig::setLogSeverity(\TrueAsync\LogSeverity $level): static
public HttpServerConfig::getLogSeverity(): \TrueAsync\LogSeveritySeverity логера. Дефолт OFF. Severity фіксується на старті — runtime-зміни не підтримуються (single-threaded lock-free модель). Див. LogSeverity.
setLogStream / getLogStream
public HttpServerConfig::setLogStream(mixed $stream): static
public HttpServerConfig::getLogStream(): mixedSink логера. Будь-який php_stream (файл, php://stderr, php://memory, user wrapper). Логер вимкнено, поки не виставлені обидва: non-OFF severity І stream.
setTelemetryEnabled / isTelemetryEnabled
public HttpServerConfig::setTelemetryEnabled(bool $enabled): static
public HttpServerConfig::isTelemetryEnabled(): boolПарсинг W3C Trace Context — вхідні traceparent / tracestate прикріплюються до request'у, доступні через HttpRequest::getTraceParent/getTraceId/....
State
isLocked
public HttpServerConfig::isLocked(): booltrue після передачі конфіга в new HttpServer(). Locked-конфіг відкидає всі сетери з HttpServerRuntimeException.
Див. також
- Конфігурація — покроковий гайд
TrueAsync\HttpServerTrueAsync\LogSeverity