TrueAsync\HttpServerConfig
(PHP 8.6+, true_async_server 0.6+)
Configuration du serveur. Toutes les méthodes sont fluent (retournent static). Une fois l'objet passé à new HttpServer($config), la configuration est gelée : tout setter lève HttpServerRuntimeException. Vérifier avec isLocked().
Voir aussi Configuration — guide pas-à-pas.
Constructeur
__construct
public HttpServerConfig::__construct(?string $host = null, int $port = 8080)Paramètres optionnels — raccourci pour un single-listener. Utilisé plus souvent sans arguments, suivi de addListener().
Listeners
addListener
public HttpServerConfig::addListener(string $host, int $port, bool $tls = false): staticListener TCP, acceptant HTTP/1.1 et HTTP/2 (h2c via détection de preface en plaintext, h2 via ALPN en TLS).
addHttp1Listener
public HttpServerConfig::addHttp1Listener(string $host, int $port, bool $tls = false): staticListener TCP HTTP/1.1 uniquement. Une connexion avec preface HTTP/2 est transmise à llhttp, qui émet un 400 Bad Request conforme et se ferme.
addHttp2Listener
public HttpServerConfig::addHttp2Listener(string $host, int $port, bool $tls = false): staticListener HTTP/2 uniquement.
$tls=false: h2c (H2 cleartext). Le listener exige la preface RFC 7540 §3.5 ; tout le reste va dansBAD_CLIENT_MAGICde nghttp2 et reçoit unGOAWAY(PROTOCOL_ERROR)conforme.$tls=true: le serveur annonce uniquementh2via ALPN.
addUnixListener
public HttpServerConfig::addUnixListener(string $path): staticListener Unix-socket (H1 + H2, style h2c).
addHttp3Listener
public HttpServerConfig::addHttp3Listener(string $host, int $port): staticHTTP/3 / QUIC over UDP. TLS 1.3 obligatoire — le certificat serveur est utilisé, il n'y a pas de flag $tls séparé. L'extension doit être compilée avec --enable-http3, sinon start() lèvera une exception.
getListeners
public HttpServerConfig::getListeners(): arrayTableau de tous les listeners enregistrés.
Limites de connexion
setBacklog / getBacklog
public HttpServerConfig::setBacklog(int $backlog): static
public HttpServerConfig::getBacklog(): intBacklog du socket. Défaut 128.
setWorkers / getWorkers
public HttpServerConfig::setWorkers(int $workers): static
public HttpServerConfig::getWorkers(): intTaille du worker-pool intégré (issue #11).
1(défaut) : mono-thread.> 1:start()spawn unAsync\ThreadPoolde la taille indiquée, config + handler-set sont répliqués viatransfer_obj, le parent attend la fin de tous les workers. Chaque worker re-bind les listeners ; le noyau balance l'accept viaSO_REUSEPORT(Linux/BSD).
setBootloader / getBootloader
public HttpServerConfig::setBootloader(?\Closure $bootloader): static
public HttpServerConfig::getBootloader(): ?\ClosureHook de startup par worker. Le pool deep-copy la closure une fois et l'exécute sur chaque worker avant la task-loop — endroit idéal pour autoload, warmup des pools de connexions, précompilation opcache.
S'applique uniquement quand setWorkers() > 1. Une exception dans le bootloader fait échouer tout le pool. Nécessite TrueAsync ABI v0.15+.
setMaxConnections / getMaxConnections
public HttpServerConfig::setMaxConnections(int $maxConnections): static
public HttpServerConfig::getMaxConnections(): intLimite stricte du nombre de connexions concurrentes. 0 : pas de limite.
setMaxInflightRequests / getMaxInflightRequests
public HttpServerConfig::setMaxInflightRequests(int $n): static
public HttpServerConfig::getMaxInflightRequests(): intAdmission control : à la limite atteinte, les nouvelles requêtes reçoivent un refus rapide — H1 → 503 + Retry-After: 1, H2 → RST_STREAM REFUSED_STREAM (retry-safe selon RFC 7540 §8.1.4). 0 : désactivé (défaut) ; si 0 reste à start(), la limite est dérivée comme max_connections × 10.
Timeouts
| Méthode | Ce qui est en timeout |
|---|---|
setReadTimeout(int) / getReadTimeout(): int | réception de la requête |
setWriteTimeout(int) / getWriteTimeout(): int | envoi de la réponse |
setKeepAliveTimeout(int) / getKeepAliveTimeout(): int | idle entre requêtes ; 0 désactive keep-alive |
setShutdownTimeout(int) / getShutdownTimeout(): int | combien de temps attendre les requêtes actives lors d'un graceful shutdown |
Valeurs en secondes. 0 (le cas échéant) désactive.
Backpressure (CoDel)
setBackpressureTargetMs / getBackpressureTargetMs
public HttpServerConfig::setBackpressureTargetMs(int $ms): static
public HttpServerConfig::getBackpressureTargetMs(): intTarget sojourn pour CoDel. Quand le queue-wait par requête reste au-dessus du seuil pendant 100 ms consécutives, le socket listen est mis en pause. Plage 0..10_000, défaut 5. 0 : désactive CoDel.
Guidance :
- handlers rapides (<5 ms) : défaut 5
- web typique : 10..20
- lent (BD, IO) : 50..100
Graceful drain (Step 8)
setMaxConnectionAgeMs / getMaxConnectionAgeMs
public HttpServerConfig::setMaxConnectionAgeMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeMs(): intAprès (age ± 10 % jitter) de lifetime : H1 prochaine réponse avec Connection: close, H2 : GOAWAY. Équivalent du MAX_CONNECTION_AGE gRPC. Défaut 0 (off) ; recommandation production 600_000 (10 min) derrière un LB L4. Doit être 0 ou ≥ 1000.
setMaxConnectionAgeGraceMs / getMaxConnectionAgeGraceMs
public HttpServerConfig::setMaxConnectionAgeGraceMs(int $ms): static
public HttpServerConfig::getMaxConnectionAgeGraceMs(): intHard-close après Connection: close/GOAWAY. 0 : pas de timer force-close ; non-zero ≥ 1000.
setDrainSpreadMs / getDrainSpreadMs
public HttpServerConfig::setDrainSpreadMs(int $ms): static
public HttpServerConfig::getDrainSpreadMs(): intFenêtre d'étalement uniforme du drain par connexion lors d'un trip CoDel / hard-cap (anti-thundering-herd). Équivalent du close-spread-time HAProxy. Défaut 5000, ≥ 100.
setDrainCooldownMs / getDrainCooldownMs
public HttpServerConfig::setDrainCooldownMs(int $ms): static
public HttpServerConfig::getDrainCooldownMs(): intGap minimal entre déclenchements réactifs de drain. Les déclenchements pendant le cooldown incrémentent un compteur de telemetry. Défaut 10_000, ≥ 1000.
Streaming HTTP/2
setStreamWriteBufferBytes / getStreamWriteBufferBytes
public HttpServerConfig::setStreamWriteBufferBytes(int $bytes): static
public HttpServerConfig::getStreamWriteBufferBytes(): intCap par stream sur la chunk-queue pour le backpressure de HttpResponse::send(). HTTP/2 only ; HTTP/1 chunked utilise le send-buffer kernel.
Défaut 262_144 (256 KiB). Plage 4_096..67_108_864 (64 MiB).
Baseline industrie : gRPC-Go 64 KiB, Envoy 1 MiB, Node.js 16 KiB.
setH2StaticBudgetMax / getH2StaticBudgetMax
public HttpServerConfig::setH2StaticBudgetMax(int $bytes): static
public HttpServerConfig::getH2StaticBudgetMax(): intCap par worker des body-buffers HTTP/2 pour fichiers statiques (read-ahead chunks + ring queues). 0 : auto (memory_limit / 8). Toute valeur explicite est clampée pour que le static budget ne dépasse pas memory_limit moins une petite réserve.
Limites de corps
setMaxBodySize / getMaxBodySize
public HttpServerConfig::setMaxBodySize(int $bytes): static
public HttpServerConfig::getMaxBodySize(): intMaximum du corps de requête (H1 et H2). H1 : 413 + close ; H2 : RST_STREAM(INTERNAL_ERROR) (la connexion reste pour les autres streams).
Défaut 10_485_760 (10 MiB). Plage 1_024..17_179_869_184 (16 GiB).
WebSocket
(true_async_server 0.9+). Guide : WebSocket.
setWsMaxMessageSize / getWsMaxMessageSize
public HttpServerConfig::setWsMaxMessageSize(int $bytes): static
public HttpServerConfig::getWsMaxMessageSize(): intTaille max du message WebSocket réassemblé. Un ensemble de frames dont le payload combiné dépasse la limite ferme la connexion avec 1009 Message Too Big (RFC 6455 §7.4.1).
Défaut 1_048_576 (1 MiB). Plage 128..268_435_456 (256 MiB).
setWsMaxFrameSize / getWsMaxFrameSize
public HttpServerConfig::setWsMaxFrameSize(int $bytes): static
public HttpServerConfig::getWsMaxFrameSize(): intPayload max pour une seule frame. Protège contre les attaques de type fragment-flood, où le client envoie des millions de fragments minuscules.
Défaut 1_048_576 (1 MiB). Même plage que setWsMaxMessageSize.
setWsPingIntervalMs / getWsPingIntervalMs
public HttpServerConfig::setWsPingIntervalMs(int $ms): static
public HttpServerConfig::getWsPingIntervalMs(): intFréquence à laquelle le serveur ping une connexion par ailleurs idle. Le pair doit répondre avec PONG dans le délai WsPongTimeoutMs, sinon la connexion est fermée avec le code 1001 GoingAway.
Défaut 30_000 (30 s). 0 désactive le ping automatique.
setWsPongTimeoutMs / getWsPongTimeoutMs
public HttpServerConfig::setWsPongTimeoutMs(int $ms): static
public HttpServerConfig::getWsPongTimeoutMs(): intLe délai PONG : combien de temps le serveur attend après un PING avant de déclarer la connexion morte.
Défaut 60_000 (60 s). 0 désactive le timeout.
setWsPermessageDeflate / getWsPermessageDeflate
public HttpServerConfig::setWsPermessageDeflate(bool $enabled): static
public HttpServerConfig::getWsPermessageDeflate(): boolActive RFC 7692 permessage-deflate (compression au niveau message). Désactivé par défaut : c'est un opt-in, parce que la compression coûte du CPU et élargit la surface d'attaque par décompression-bombe. Négocié uniquement quand le client offre l'extension ; le plafond du message réassemblé est vérifié aussi bien avant qu'après l'inflate. Nécessite un build avec zlib (compression HTTP).
Knobs HTTP/3
setHttp3IdleTimeoutMs / getHttp3IdleTimeoutMs
public HttpServerConfig::setHttp3IdleTimeoutMs(int $ms): static
public HttpServerConfig::getHttp3IdleTimeoutMs(): intQUIC max_idle_timeout (RFC 9000 §10.1). Défaut 30_000 (30 s). Plage 0..UINT32_MAX (~49 jours) ; 0 annonce "no idle timeout". La variable d'env legacy PHP_HTTP3_IDLE_TIMEOUT_MS fonctionne toujours comme ops escape hatch.
setHttp3StreamWindowBytes / getHttp3StreamWindowBytes
public HttpServerConfig::setHttp3StreamWindowBytes(int $bytes): static
public HttpServerConfig::getHttp3StreamWindowBytes(): intFenêtre de flow-control QUIC par stream. Positionne les trois : initial_max_stream_data_bidi_local, _bidi_remote, _uni (style h2o http3-input-window-size). Le initial_max_data au niveau connexion est dérivé comme window × max_concurrent_streams (pattern nginx).
Défaut 262_144 (256 KiB). Plage 1_024..1_073_741_824 (1 GiB).
setHttp3MaxConcurrentStreams / getHttp3MaxConcurrentStreams
public HttpServerConfig::setHttp3MaxConcurrentStreams(int $n): static
public HttpServerConfig::getHttp3MaxConcurrentStreams(): intQUIC initial_max_streams_bidi. Équivalent de http3_max_concurrent_streams nginx. Défaut 100, plage 1..1_000_000.
setHttp3PeerConnectionBudget / getHttp3PeerConnectionBudget
public HttpServerConfig::setHttp3PeerConnectionBudget(int $n): static
public HttpServerConfig::getHttp3PeerConnectionBudget(): intCap par IP source du nombre de connexions QUIC concurrentes. Protection contre handshake slow-loris et amplification. Défaut 16, plage 1..4_096. La variable d'env legacy PHP_HTTP3_PEER_BUDGET override encore au spawn du listener.
setHttp3AltSvcEnabled / isHttp3AltSvcEnabled
public HttpServerConfig::setHttp3AltSvcEnabled(bool $enable): static
public HttpServerConfig::isHttp3AltSvcEnabled(): boolRFC 7838 Alt-Svc: h3=":<port>"; ma=86400 sur les réponses H1/H2 quand un listener H3 est levé. Défaut true. À désactiver pour un rollout H3 progressif. La variable d'env legacy PHP_HTTP3_DISABLE_ALT_SVC est honorée à start().
Compression
setCompressionEnabled / isCompressionEnabled
public HttpServerConfig::setCompressionEnabled(bool $enable): static
public HttpServerConfig::isCompressionEnabled(): boolMaster switch. Défaut true. Si l'extension est compilée sans --enable-http-compression, seul false est accepté — true lève une exception.
setCompressionLevel / getCompressionLevel
public HttpServerConfig::setCompressionLevel(int $level): static
public HttpServerConfig::getCompressionLevel(): intNiveau gzip. Sémantique zlib : 1 = rapide/faible, 9 = lent/fort. Défaut 6.
setBrotliLevel / getBrotliLevel
public HttpServerConfig::setBrotliLevel(int $level): static
public HttpServerConfig::getBrotliLevel(): intBrotli quality. Plage 0..11. Défaut 4 (production-typique ; quality 11 ≈ 50× plus lent que quality 4 pour un gain marginal en ratio).
Inerte si l'extension est compilée sans --enable-brotli — le pipeline ne sélectionnera jamais Brotli sans HAVE_HTTP_BROTLI, quoi que vous passiez ici.
setZstdLevel / getZstdLevel
public HttpServerConfig::setZstdLevel(int $level): static
public HttpServerConfig::getZstdLevel(): intNiveau zstd. Plage 1..22. Défaut 3 — production-default de l'équipe zstd (meilleur ratio que gzip-6 à throughput plus élevé).
setCompressionMinSize / getCompressionMinSize
public HttpServerConfig::setCompressionMinSize(int $bytes): static
public HttpServerConfig::getCompressionMinSize(): intSeuil de taille de corps — en deçà, pas de compression. Défaut 1024 (1 KiB). Plage 0..16 MiB.
setCompressionMimeTypes / getCompressionMimeTypes
public HttpServerConfig::setCompressionMimeTypes(array $types): static
public HttpServerConfig::getCompressionMimeTypes(): arrayWhitelist MIME pour la compression. Remplace intégralement le défaut (sémantique gzip_types nginx). Les entrées sont normalisées au setter : les paramètres (; charset=...) sont coupés, les espaces trimmés, tout en minuscules.
Défaut : ["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(): intCap anti zip-bomb sur les corps décodés (Content-Encoding: gzip/br/zstd entrant). En cas de dépassement : 413. 0 désactive le cap (explicitement — il n'y a pas de illimité-implicite). Défaut 10_485_760 (10 MiB).
getSupportedEncodings (static)
public static HttpServerConfig::getSupportedEncodings(): arrayListe des codecs compilés dans cette build, dans l'ordre de préférence du serveur. Contient toujours "identity" ; "gzip" si --enable-http-compression a réussi ; "br" / "zstd" si la bibliothèque correspondante est présente à configure-time.
Buffers
setWriteBufferSize / getWriteBufferSize
public HttpServerConfig::setWriteBufferSize(int $size): static
public HttpServerConfig::getWriteBufferSize(): intTaille du write-buffer.
Options protocole
| Méthode | Rôle |
|---|---|
enableHttp2(bool) / isHttp2Enabled(): bool | toggle HTTP/2 (TODO) |
enableWebSocket(bool) / isWebSocketEnabled(): bool | toggle WS (TODO) |
enableProtocolDetection(bool) / isProtocolDetectionEnabled(): bool | détection auto du protocole sur le listener |
enableWebSocket()est un toggle séparé, pas encore implémenté. WebSocket lui-même fonctionne déjà pleinement viaaddWebSocketHandler()et les réglages de la section WebSocket ci-dessus ; les deux drapeaux sont sans rapport.
TLS
| Méthode | Rôle |
|---|---|
enableTls(bool) / isTlsEnabled(): bool | toggle TLS sur le listener par défaut |
setCertificate(string) / getCertificate(): ?string | chemin vers le certificat PEM |
setPrivateKey(string) / getPrivateKey(): ?string | chemin vers la clé PEM |
Gestion du corps
setAutoAwaitBody / isAutoAwaitBodyEnabled
public HttpServerConfig::setAutoAwaitBody(bool $enable): static
public HttpServerConfig::isAutoAwaitBodyEnabled(): boolQuand true, les requêtes non multipart attendent le corps complet avant l'appel du handler. Le multipart est toujours en streaming. Défaut true.
setBodyStreamingEnabled / isBodyStreamingEnabled
public HttpServerConfig::setBodyStreamingEnabled(bool $enabled): static
public HttpServerConfig::isBodyStreamingEnabled(): boolStreaming des corps de requête dans une file par requête (issue #26) au lieu d'accumuler dans req->body. Les handlers doivent lire via HttpRequest::readBody() ; getBody() lève une exception.
JSON
setJsonEncodeFlags / getJsonEncodeFlags
public HttpServerConfig::setJsonEncodeFlags(int $flags): static
public HttpServerConfig::getJsonEncodeFlags(): intDrapeaux JSON_* par défaut pour HttpResponse::json(), quand le $flags=0 par appel (ou omis).
Défaut : JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES.
JSON_THROW_ON_ERROR est silencieusement retiré — une erreur d'encode donne 500 avec corps JSON d'erreur, l'exception n'est pas propagée.
Logging / télémétrie
setLogSeverity / getLogSeverity
public HttpServerConfig::setLogSeverity(\TrueAsync\LogSeverity $level): static
public HttpServerConfig::getLogSeverity(): \TrueAsync\LogSeveritySeverity du logger. Défaut OFF. Figée au démarrage — pas de changement runtime supporté (modèle mono-thread lock-free). Voir LogSeverity.
setLogStream / getLogStream
public HttpServerConfig::setLogStream(mixed $stream): static
public HttpServerConfig::getLogStream(): mixedSink du logger. Tout php_stream (fichier, php://stderr, php://memory, user wrapper). Le logger est désactivé tant que les deux ne sont pas positionnés : severity non-OFF ET stream.
setTelemetryEnabled / isTelemetryEnabled
public HttpServerConfig::setTelemetryEnabled(bool $enabled): static
public HttpServerConfig::isTelemetryEnabled(): boolParsing W3C Trace Context — traceparent / tracestate entrants sont attachés à la requête, disponibles via HttpRequest::getTraceParent/getTraceId/....
État
isLocked
public HttpServerConfig::isLocked(): booltrue après passage de la config à new HttpServer(). Une config locked refuse tous les setters avec HttpServerRuntimeException.