TrueAsync\HttpServerConfig
(PHP 8.6+, true_async_server 0.6+)
Configurazione del server. Tutti i metodi sono fluent (restituiscono static). Dopo aver passato l'oggetto a new HttpServer($config) la configurazione viene congelata: ogni setter lancia HttpServerRuntimeException. Verifica: isLocked().
Vedi anche Configurazione: guida passo passo.
Costruttore
__construct
public HttpServerConfig::__construct(?string $host = null, int $port = 8080)I parametri opzionali sono una scorciatoia per un singolo listener. Più spesso si usa senza argomenti insieme a addListener().
Listener
addListener
public HttpServerConfig::addListener(string $host, int $port, bool $tls = false): staticListener TCP, accetta HTTP/1.1 e HTTP/2 (h2c tramite preface detection in plaintext, h2 tramite ALPN su TLS).
addHttp1Listener
public HttpServerConfig::addHttp1Listener(string $host, int $port, bool $tls = false): staticListener TCP solo HTTP/1.1. Una connessione con preface HTTP/2 viene passata a llhttp, che emette un 400 Bad Request conforme e si chiude.
addHttp2Listener
public HttpServerConfig::addHttp2Listener(string $host, int $port, bool $tls = false): staticListener solo HTTP/2.
$tls=false: h2c (H2 in chiaro). Il listener richiede il preface RFC 7540 §3.5; il resto va inBAD_CLIENT_MAGICdi nghttp2 e riceveGOAWAY(PROTOCOL_ERROR)conforme.$tls=true: il server annuncia soloh2via ALPN.
addUnixListener
public HttpServerConfig::addUnixListener(string $path): staticListener su socket Unix (H1 + H2, stile h2c).
addHttp3Listener
public HttpServerConfig::addHttp3Listener(string $host, int $port): staticHTTP/3 / QUIC su UDP. TLS 1.3 è obbligatorio: viene preso il certificato del server, non c'è un flag $tls separato. L'estensione deve essere compilata con --enable-http3, altrimenti start() lancerà un'eccezione.
getListeners
public HttpServerConfig::getListeners(): arrayArray di tutti i listener registrati.
Limiti di connessione
setBacklog / getBacklog
public HttpServerConfig::setBacklog(int $backlog): static
public HttpServerConfig::getBacklog(): intBacklog del socket. Default 128.
setWorkers / getWorkers
public HttpServerConfig::setWorkers(int $workers): static
public HttpServerConfig::getWorkers(): intDimensione del worker pool integrato (issue #11).
1(default): single-threaded.> 1:start()crea unAsync\ThreadPooldella dimensione indicata, configurazione + set degli handler vengono replicati tramitetransfer_obj, il padre attende il termine di tutti i worker. Ogni worker rifa il bind dei listener; il kernel distribuisce gli accept tramiteSO_REUSEPORT(Linux/BSD).
setBootloader / getBootloader
public HttpServerConfig::setBootloader(?\Closure $bootloader): static
public HttpServerConfig::getBootloader(): ?\ClosureHook di startup per worker. Il pool deep-copia la closure una volta e la esegue in ogni worker prima del task loop: il posto ideale per autoload, riscaldamento dei pool di connessioni, precompilazione di opcache.
Si applica solo quando setWorkers() > 1. Un'eccezione dal bootloader fa fallire l'intero pool. Richiede TrueAsync ABI v0.15+.
setMaxConnections / getMaxConnections
public HttpServerConfig::setMaxConnections(int $maxConnections): static
public HttpServerConfig::getMaxConnections(): intLimite rigido sulle connessioni concorrenti. 0: nessun limite.
setMaxInflightRequests / getMaxInflightRequests
public HttpServerConfig::setMaxInflightRequests(int $n): static
public HttpServerConfig::getMaxInflightRequests(): intControllo di ammissione: al raggiungimento del limite le nuove richieste ricevono un rifiuto rapido: H1 → 503 + Retry-After: 1, H2 → RST_STREAM REFUSED_STREAM (retry-safe per RFC 7540 §8.1.4). 0 significa disabilitato (default); se 0 resta tale a start(), il limite viene derivato come max_connections × 10.
Timeout
| Metodo | Cosa fa scattare il timeout |
|---|---|
setReadTimeout(int) / getReadTimeout(): int | ricezione della richiesta |
setWriteTimeout(int) / getWriteTimeout(): int | invio della risposta |
setKeepAliveTimeout(int) / getKeepAliveTimeout(): int | idle tra richieste; 0 disattiva il keep-alive |
setShutdownTimeout(int) / getShutdownTimeout(): int | quanto attendere le richieste attive durante il graceful shutdown |
Valori in secondi. 0 (dove applicabile): disattivato.
Contropressione (CoDel)
setBackpressureTargetMs / getBackpressureTargetMs
public HttpServerConfig::setBackpressureTargetMs(int $ms): static
public HttpServerConfig::getBackpressureTargetMs(): intSojourn obiettivo per CoDel. Quando il tempo di attesa in coda per richiesta resta sopra la soglia per 100 ms consecutivi, il socket in ascolto viene messo in pausa. Intervallo 0..10_000, default 5. 0 disattiva CoDel.
Linee guida:
- handler veloci (<5 ms): default 5
- web tipico: 10..20
- lenti (DB, IO): 50..100
Graceful drain (Step 8)
setMaxConnectionAgeMs / getMaxConnectionAgeMs
public HttpServerConfig::setMaxConnectionAgeMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeMs(): intDopo (age ± 10% jitter) di vita: H1 invia la prossima risposta con Connection: close, H2 emette GOAWAY. Analogo a MAX_CONNECTION_AGE di gRPC. Default 0 (off); raccomandazione produzione 600_000 (10 min) dietro un LB L4. Deve essere 0 o ≥ 1000.
setMaxConnectionAgeGraceMs / getMaxConnectionAgeGraceMs
public HttpServerConfig::setMaxConnectionAgeGraceMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeGraceMs(): intHard-close dopo Connection: close/GOAWAY. 0: nessun timer di force-close; non-zero ≥ 1000.
setDrainSpreadMs / getDrainSpreadMs
public HttpServerConfig::setDrainSpreadMs(int $ms): static
public HttpServerConfig::getDrainSpreadMs(): intFinestra di distribuzione uniforme del drain per connessione al trigger CoDel / hard-cap (anti-thundering-herd). Analogo a close-spread-time di HAProxy. Default 5000, ≥ 100.
setDrainCooldownMs / getDrainCooldownMs
public HttpServerConfig::setDrainCooldownMs(int $ms): static
public HttpServerConfig::getDrainCooldownMs(): intGap minimo tra trigger reattivi di drain. I trigger entro il cooldown incrementano un counter di telemetria. Default 10_000, ≥ 1000.
Streaming HTTP/2
setStreamWriteBufferBytes / getStreamWriteBufferBytes
public HttpServerConfig::setStreamWriteBufferBytes(int $bytes): static
public HttpServerConfig::getStreamWriteBufferBytes(): intLimite della coda di chunk per stream per la contropressione di HttpResponse::send(). Solo HTTP/2; HTTP/1 chunked usa il buffer di invio del kernel.
Default 262_144 (256 KiB). Intervallo 4_096..67_108_864 (64 MiB).
Riferimenti industria: gRPC-Go 64 KiB, Envoy 1 MiB, Node.js 16 KiB.
setH2StaticBudgetMax / getH2StaticBudgetMax
public HttpServerConfig::setH2StaticBudgetMax(int $bytes): static
public HttpServerConfig::getH2StaticBudgetMax(): intCap per worker sui buffer del corpo dei file statici HTTP/2 (chunk di read-ahead + ring queues). 0: auto (memory_limit / 8). Qualunque valore esplicito viene comunque clampato perché il budget statico non superi memory_limit meno una piccola riserva.
Limiti del corpo
setMaxBodySize / getMaxBodySize
public HttpServerConfig::setMaxBodySize(int $bytes): static
public HttpServerConfig::getMaxBodySize(): intMassimo per il corpo della richiesta (H1 e H2). H1 → 413 + close; H2 → RST_STREAM(INTERNAL_ERROR) (la connessione resta aperta per altri stream).
Default 10_485_760 (10 MiB). Intervallo 1_024..17_179_869_184 (16 GiB).
Parametri HTTP/3
setHttp3IdleTimeoutMs / getHttp3IdleTimeoutMs
public HttpServerConfig::setHttp3IdleTimeoutMs(int $ms): static
public HttpServerConfig::getHttp3IdleTimeoutMs(): intQUIC max_idle_timeout (RFC 9000 §10.1). Default 30_000 (30 s). Intervallo 0..UINT32_MAX (~49 giorni); 0 annuncia "no idle timeout". La variabile d'ambiente legacy PHP_HTTP3_IDLE_TIMEOUT_MS continua a funzionare come escape hatch ops.
setHttp3StreamWindowBytes / getHttp3StreamWindowBytes
public HttpServerConfig::setHttp3StreamWindowBytes(int $bytes): static
public HttpServerConfig::getHttp3StreamWindowBytes(): intFinestra di flow control QUIC per stream. Imposta tutte e tre: initial_max_stream_data_bidi_local, _bidi_remote, _uni (stile http3-input-window-size di h2o). L'initial_max_data a livello di connessione viene derivato come window × max_concurrent_streams (pattern nginx).
Default 262_144 (256 KiB). Intervallo 1_024..1_073_741_824 (1 GiB).
setHttp3MaxConcurrentStreams / getHttp3MaxConcurrentStreams
public HttpServerConfig::setHttp3MaxConcurrentStreams(int $n): static
public HttpServerConfig::getHttp3MaxConcurrentStreams(): intQUIC initial_max_streams_bidi. Analogo a http3_max_concurrent_streams di nginx. Default 100, intervallo 1..1_000_000.
setHttp3PeerConnectionBudget / getHttp3PeerConnectionBudget
public HttpServerConfig::setHttp3PeerConnectionBudget(int $n): static
public HttpServerConfig::getHttp3PeerConnectionBudget(): intLimite per IP di origine sulle connessioni QUIC concorrenti. Protezione da handshake slow-loris e amplification. Default 16, intervallo 1..4_096. La variabile d'ambiente legacy PHP_HTTP3_PEER_BUDGET continua a fare override allo spawn del listener.
setHttp3AltSvcEnabled / isHttp3AltSvcEnabled
public HttpServerConfig::setHttp3AltSvcEnabled(bool $enable): static
public HttpServerConfig::isHttp3AltSvcEnabled(): boolAlt-Svc: h3=":<port>"; ma=86400 (RFC 7838) sulle risposte H1/H2 quando è attivo un listener H3. Default true. Disattivalo per un rollout H3 graduale. La variabile d'ambiente legacy PHP_HTTP3_DISABLE_ALT_SVC viene rispettata su start().
Compressione
setCompressionEnabled / isCompressionEnabled
public HttpServerConfig::setCompressionEnabled(bool $enable): static
public HttpServerConfig::isCompressionEnabled(): boolInterruttore principale. Default true. Se l'estensione è compilata senza --enable-http-compression, viene accettato solo false: true lancia un'eccezione.
setCompressionLevel / getCompressionLevel
public HttpServerConfig::setCompressionLevel(int $level): static
public HttpServerConfig::getCompressionLevel(): intLivello gzip. Semantica zlib: 1 = più veloce/debole, 9 = lento/forte. Default 6.
setBrotliLevel / getBrotliLevel
public HttpServerConfig::setBrotliLevel(int $level): static
public HttpServerConfig::getBrotliLevel(): intQuality Brotli. Intervallo 0..11. Default 4 (tipico produzione; quality 11 ≈ 50× più lento di quality 4 con guadagno marginale sul rapporto).
Inerte se l'estensione è compilata senza --enable-brotli: la pipeline di risposta non sceglierà mai Brotli senza HAVE_HTTP_BROTLI, qualunque cosa si passi qui.
setZstdLevel / getZstdLevel
public HttpServerConfig::setZstdLevel(int $level): static
public HttpServerConfig::getZstdLevel(): intLivello zstd. Intervallo 1..22. Default 3: il default di produzione consigliato dal team di zstd (rapporto migliore di gzip-6 con throughput più alto).
setCompressionMinSize / getCompressionMinSize
public HttpServerConfig::setCompressionMinSize(int $bytes): static
public HttpServerConfig::getCompressionMinSize(): intSoglia di dimensione del corpo: sotto la quale non si comprime. Default 1024 (1 KiB). Intervallo 0..16 MiB.
setCompressionMimeTypes / getCompressionMimeTypes
public HttpServerConfig::setCompressionMimeTypes(array $types): static
public HttpServerConfig::getCompressionMimeTypes(): arrayWhitelist MIME per la compressione. Sostituisce completamente il default (semantica gzip_types di nginx). Le voci vengono normalizzate al setter: i parametri (; charset=...) vengono tagliati, gli spazi rimossi, tutto in lowercase.
Default: ["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(): intTetto anti zip-bomb sui corpi decompressi (Content-Encoding: gzip/br/zstd in ingresso). Al superamento → 413. 0 disattiva il tetto (esplicitamente: nessun illimitato implicito). Default 10_485_760 (10 MiB).
getSupportedEncodings (static)
public static HttpServerConfig::getSupportedEncodings(): arrayElenco dei codec compilati in questa build, in ordine di preferenza del server. Contiene sempre "identity"; "gzip" se --enable-http-compression ha avuto successo; "br" / "zstd" se la libreria corrispondente era disponibile al configure time.
Buffer
setWriteBufferSize / getWriteBufferSize
public HttpServerConfig::setWriteBufferSize(int $size): static
public HttpServerConfig::getWriteBufferSize(): intDimensione del write buffer.
Opzioni di protocollo
| Metodo | Scopo |
|---|---|
enableHttp2(bool) / isHttp2Enabled(): bool | toggle HTTP/2 (TODO) |
enableWebSocket(bool) / isWebSocketEnabled(): bool | toggle WS (TODO) |
enableProtocolDetection(bool) / isProtocolDetectionEnabled(): bool | autodetect del protocollo sul listener |
TLS
| Metodo | Scopo |
|---|---|
enableTls(bool) / isTlsEnabled(): bool | toggle TLS sul listener predefinito |
setCertificate(string) / getCertificate(): ?string | path al certificato PEM |
setPrivateKey(string) / getPrivateKey(): ?string | path alla chiave PEM |
Gestione del corpo
setAutoAwaitBody / isAutoAwaitBodyEnabled
public HttpServerConfig::setAutoAwaitBody(bool $enable): static
public HttpServerConfig::isAutoAwaitBodyEnabled(): boolSe true, le richieste non multipart attendono il corpo completo prima della chiamata all'handler. Il multipart è sempre in streaming. Default true.
setBodyStreamingEnabled / isBodyStreamingEnabled
public HttpServerConfig::setBodyStreamingEnabled(bool $enabled): static
public HttpServerConfig::isBodyStreamingEnabled(): boolStreaming dei corpi richiesta in una coda per richiesta (issue #26) invece di accumulare in req->body. Gli handler devono leggere tramite HttpRequest::readBody(); getBody() lancia un'eccezione.
JSON
setJsonEncodeFlags / getJsonEncodeFlags
public HttpServerConfig::setJsonEncodeFlags(int $flags): static
public HttpServerConfig::getJsonEncodeFlags(): intFlag JSON_* predefiniti per HttpResponse::json() quando $flags=0 per chiamata (oppure omesso).
Default: JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES.
JSON_THROW_ON_ERROR viene rimosso silenziosamente: un errore di encode produce un 500 di errore JSON, l'eccezione non viene propagata.
Logging / telemetria
setLogSeverity / getLogSeverity
public HttpServerConfig::setLogSeverity(\TrueAsync\LogSeverity $level): static
public HttpServerConfig::getLogSeverity(): \TrueAsync\LogSeveritySeverity del logger. Default OFF. La severity viene fissata all'avvio: non sono supportati cambi a runtime (modello single-threaded lock-free). Vedi LogSeverity.
setLogStream / getLogStream
public HttpServerConfig::setLogStream(mixed $stream): static
public HttpServerConfig::getLogStream(): mixedSink del logger. Qualsiasi php_stream (file, php://stderr, php://memory, user wrapper). Il logger resta disattivato finché non sono impostati entrambi: severity diversa da OFF E stream.
setTelemetryEnabled / isTelemetryEnabled
public HttpServerConfig::setTelemetryEnabled(bool $enabled): static
public HttpServerConfig::isTelemetryEnabled(): boolParsing W3C Trace Context: traceparent / tracestate in ingresso vengono agganciati alla richiesta e sono disponibili tramite HttpRequest::getTraceParent/getTraceId/....
Stato
isLocked
public HttpServerConfig::isLocked(): booltrue dopo aver passato la configurazione a new HttpServer(). Una configurazione bloccata rifiuta ogni setter con HttpServerRuntimeException.
Vedi anche
- Configurazione: guida passo passo
TrueAsync\HttpServerTrueAsync\LogSeverity