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).
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 |
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.
Voir aussi
- Configuration — guide pas-à-pas
TrueAsync\HttpServerTrueAsync\LogSeverity