Chaque réglage est une variable d'environnement
Chaque réglage est une variable d'environnement — avec en plus un fichier facultatif, .oxphpdeny, pour les règles de refus de chemins — et chaque variable possède une valeur par défaut fiable en production. Déployez un environnement vide, puis ne redéfinissez que les variables qui comptent vraiment pour vous.
Tout ce qui sort de cet ensemble — une faute de frappe comme « ture » — échoue immédiatement au démarrage, en nommant la variable. Vide équivaut à non défini : les substitutions FOO=${FOO} qui produisent FOO= retombent sur la valeur par défaut au lieu de refuser de démarrer.
Serveur et workers
15 variablesAdresse et port du serveur HTTP principal.
Répertoire racine pour servir les fichiers et les scripts PHP.
Script d'entrée canonique unique. Non défini = mappage direct des fichiers, *.php = contrôleur frontal, non-.php = fallback SPA ; en mode worker — le bootstrap du worker. Résolu par rapport à DOCUMENT_ROOT.
Active le mode worker persistant. Nécessite qu'ENTRY_FILE pointe vers un script .php.
Nombre maximal de connexions TCP simultanées. Sert aussi de plafond au QUEUE_MAX_WAITING par défaut (sa moitié) ; une valeur malformée est une erreur au démarrage. À garder au-dessus de PHP_WORKERS + QUEUE_CAPACITY + QUEUE_MAX_WAITING.
Threads d'E/S asynchrones. 1 = mono-thread, N = nombre fixe, non défini = auto. Partage les cœurs avec PHP_WORKERS — le porter au nombre total de cœurs coûte généralement du débit. CPU compte les cœurs sur lesquels le processus peut s'exécuter (masque d'affinité, abaissé à un quota cgroup), et non un poids CPU ni une limite qu'une plateforme impose hors du conteneur ; la ligne de démarrage CPU count for default sizing indique ce qui a été compté.
Backend d'exécution PHP : sapi pour du vrai PHP, stub pour le benchmark sans PHP.
Taille du pool de workers. N = pool fixe, MIN:MAX = mise à l'échelle dynamique, 0 = auto. Le dimensionnement auto compte les CPU comme TOKIO_WORKERS — sur une offre dont le conteneur ne voit pas la limite CPU (cpu_source: host dans le log de démarrage), définissez les deux explicitement.
Secondes pendant lesquelles un worker dynamique reste inactif avant d'être retiré. Le retrait attend un moment sans rien en cours, si bien que les requêtes en vol ne sont jamais interrompues.
Nombre maximal de requêtes en attente dans la file PHP ; les arrivées sur une file pleine attendent jusqu'à QUEUE_WAIT_TIMEOUT_MS. 0 = auto. Pour les pools MIN:MAX, les workers initiaux = le minimum.
Plafond de la durée pendant laquelle une requête peut attendre un worker PHP avant un 529 — une seule échéance couvrant l'attente d'une place dans la file et dans la file. En surcharge, le serveur la raccourcit de lui-même (jusqu'à 1/64, min 10 ms) ; oxphp_admission_wait_budget_us indique la valeur en vigueur. 0 = rejeter dès que la file est pleine.
Nombre maximal de requêtes stationnées en attente d'une place dans la file ; au-delà, 529 immédiat. Chaque requête en attente détient une connexion et son corps mis en tampon. 0 = auto.
Nombre maximal d'octets de corps de requête détenus par l'ensemble en attente ; un corps qui le dépasserait reçoit un 529 immédiat, les requêtes sans corps continuent d'attendre. 0 = auto.
Plafond mémoire par worker en Mio avant recyclage. 0 = illimité. Les workers sont aussi recyclés après trois requêtes consécutives qui ont mal tourné, ou à la demande via Worker::scheduleExit().
Construit $_SERVER et $_GET avant chaque script. Falsy = ce travail est sauté ; $_POST, $_FILES, $_COOKIE et php://input ne sont pas affectés.
Trafic et distribution
18 variablesNombre maximal de secondes pour recevoir les en-têtes HTTP après la connexion (protection contre Slowloris).
Nombre maximal de secondes accordées aux requêtes en cours lors d'un arrêt gracieux ; les retardataires sont ensuite annulées. Une requête bloquée dans un appel bloquant peut retenir le processus au-delà.
Nombre maximal de requêtes par IP et par fenêtre. 0 = désactivé ; une file PHP pleine répond 529.
Durée de la fenêtre de limitation de débit en secondes.
Chemin vers le certificat PEM. TLS_CERT et TLS_KEY doivent tous deux être définis pour activer TLS.
Chemin vers la clé privée PEM.
Version TLS minimale : 1.2 ou 1.3. Validée au démarrage même lorsque TLS est désactivé.
Nombre maximal de flux ouverts simultanément par connexion.
Nombre maximal de trames RST_STREAM en file avant la fermeture de la connexion (protection contre Rapid Reset).
Nombre maximal d'octets d'en-têtes décodés au total par requête.
Secondes entre les trames PING ; 0 désactive.
Secondes d'attente d'une réponse PING avant la fermeture de la connexion.
Cache-Control : max-age pour les fichiers statiques. Accepte 30s, 5m, 2h, 30d, 1w, 1y, un nombre de secondes brut ou off. Remplace STATIC_CACHE_TTL.
Revalidation par mtime pour le cache en mémoire — vérifiée au plus toutes les 3 s par fichier. Remplace STATIC_CACHE.
Codages de contenu proposés : br, zstd, gzip. off/none désactive la compression. L'ordre est ignoré — les fichiers statiques en cache préfèrent Brotli, tout le reste zstd.
Qualité Brotli 0–11 ; 0 retire Brotli. Remplace COMPRESSION_LEVEL (dont le 0 désactive toujours tous les codages).
Niveau Zstandard 0–19 ; 0 retire zstd. Les valeurs hors plage interrompent le démarrage.
Niveau gzip 0–9 ; 0 retire gzip. Les valeurs hors plage interrompent le démarrage.
Sécurité
5 variablesProtection contre le clickjacking : SAMEORIGIN, DENY ou off. Définit X-Frame-Options + CSP frame-ancestors sur chaque réponse ; les en-têtes définis par l'application l'emportent toujours. Les valeurs invalides retombent sur SAMEORIGIN avec un avertissement au démarrage.
Proxys de confiance : un mélange, séparé par des virgules, de CIDR, d'IP nues et des mots-clés private et cloudflare. Adresse IP réelle du client extraite de Forwarded / X-Forwarded-* via l'entrée la plus à droite non approuvée ; avec cloudflare, de CF-Connecting-IP lorsque la requête est passée par un serveur edge de Cloudflare.
Motifs glob dont les fichiers .php ne s'exécutent jamais via une URI directe (/uploads/**). Comparés avant toute E/S disque — aucun oracle d'existence.
Réponse en cas de correspondance PHP_DENY_PATHS ou de règle de refus .oxphpdeny : un statut HTTP 400–599 ou un script PHP de repli préfixé par / dans DOCUMENT_ROOT. En mode worker, les règles de refus .oxphpdeny n'acceptent qu'un code de statut.
Chemins absolus sous lesquels les liens symboliques peuvent sortir de DOCUMENT_ROOT. Non défini = aucune sortie autorisée.
Journaux, traces et profils
39 variablesVerbosité des diagnostics propres au serveur : trace, debug, info, warn, error. Ne filtre pas le journal d'accès ; les déconnexions client sont journalisées au niveau debug.
Journal d'accès par requête : all = chaque requête, error = uniquement 4xx/5xx, non défini = désactivé.
Serveur interne (/health, /metrics, /config). Les valeurs à port seul écoutent sur 127.0.0.1 ; non défini = non démarré.
Liste d'autorisation CIDR pour le serveur interne ; les tiers reçoivent un 403, les sondes de santé restent accessibles. Le loopback n'est pas implicite.
Répertoire contenant des pages d'erreur {status}.html personnalisées.
Nombre maximal d'octets de corps pour les endpoints de requête internes (512 Kio).
Propagation W3C Trace Context : lit traceparent/tracestate et les transmet à PHP via $_SERVER.
Active l'export des spans OpenTelemetry. Implique TRACE_CONTEXT=true.
Protocole d'export : grpc ou http/protobuf.
Endpoint du collecteur OTLP. Avec http/protobuf, c'est une URL de base : les spans sont envoyés à /v1/traces sous celle-ci.
Délai d'expiration de l'export en millisecondes. En gRPC, il borne aussi la connexion au collecteur, poignée de main TLS comprise, et sous Linux fixe le délai au bout duquel une connexion qui a cessé d'accepter des données est fermée.
En-têtes d'authentification : key=value,key2=value2.
Nom du service dans les spans exportés.
Attribut de version du service.
Attributs de ressource supplémentaires : env=prod,region=us-east-1.
Stratégie d'échantillonnage : always_on, always_off, traceidratio et les variantes parentbased_*.
Ratio d'échantillonnage 0.0–1.0 pour les échantillonneurs basés sur un ratio ; les valeurs hors plage sont bornées.
APM : auto-instrumentation de 34 fonctions PHP (PDO, mysqli, cURL, Redis…), capture des erreurs, SDK de traçage. Nécessite OTEL_ENABLED. Désactivé, oxphp_apm_trace() exécute tout de même son callback.
Seuil de requête lente en ms ; les requêtes de base de données plus lentes reçoivent oxphp.db.slow=true.
Enregistre les paramètres liés dans les spans db.params. Enregistrés bruts (non obfusqués), ce qui peut placer des PII dans les traces — à n'activer que là où c'est acceptable.
Limite de l'attribut exception.stacktrace ; tronqué par la fin. 0 = aucune troncature.
Limite de l'attribut exception.message (limite par attribut de New Relic) ; tronqué par la fin. 0 = aucune troncature.
Interrupteur principal. Les autres variables PROFILER_* sont tout de même analysées, de sorte que les fautes de frappe apparaissent au démarrage.
Probabilité 0.0–1.0 qu'une requête soit échantillonnée.
Échantillonne aussi les requêtes vers le serveur interne.
Secret que doivent porter les déclencheurs explicites (en-tête X-OxPHP-Profile, cookie OXPROF, paramètre __oxprof), et jeton Bearer pour /__profiler/*. Non défini = aucun jeton. L'échantillonnage et les fonctions OxPHP\Profile\* ne le vérifient jamais.
Limite de spans par requête ; les profils plus longs sont tronqués.
Profondeur d'imbrication maximale des appels enregistrés ; le temps des appels plus profonds est replié dans l'appel situé à la limite. Bornée à 32.
Répertoire pour les profils sur disque.
Formats écrits sur disque : xhprof, speedscope, pprof, flamegraph.
Limite de débit sur le nombre de fichiers de profil écrits par seconde.
Nombre maximal de fichiers de profil conservés ; les plus anciens sont supprimés.
Endpoint distant vers lequel envoyer les profils en POST.
Format de transmission pour les exports.
Jeton Bearer envoyé avec chaque export.
Enveloppe compatible XHGui ; non défini = détection automatique à partir de l'URL.
Enveloppe Buggregator (toujours xhprof) ; non défini = détection automatique à partir de l'URL. Mutuellement exclusif avec PROFILER_EXPORT_XHGUI.
app_name Buggregator pour le regroupement par projet.
Tags Buggregator : key=value,key2=value2. Les jetons malformés sont une erreur au démarrage.
Asynchrone et état partagé
18 variablesRemplacements opt-in, suspendant la Fiber, de fonctions natives bloquantes. Catégories : sleep (sleep/usleep natifs), streams (lectures tcp:// bloquantes et stream_select), net (établissements de connexion, poignées de main et lectures TLS, écritures en attente de place dans le tampon, lectures unix:// / udp:// / udg:// — nécessite streams, Linux uniquement). 1/true/all = toutes les catégories. L'ensemble installé apparaît comme runtime_hooks dans /config.
Threads worker asynchrones dédiés. 0 = fonctions enregistrées mais levant AsyncException à l'appel.
Nombre maximal de tâches en attente dans la file asynchrone. 0 = auto.
Limite par worker de Fibers de tâches concurrentes ; limite globale en cours = Fibers × workers.
Interrupteur principal pour l'ensemble du sous-système OxPHP\Shared\*. Désactivé = ses classes ne sont pas enregistrées du tout ; protégez-vous avec class_exists().
Limite globale sur les objets Shared vivants (les clés de Map ne comptent pas) ; en créer un au-delà lève CapacityException.
Limite globale sur la mémoire estimée des objets Shared, vérifiée uniquement à la création d'un objet.
Active ou désactive l'exposition Prometheus oxphp_shared_*.
Active ou désactive l'API d'introspection /__ox_shared/*.
Aperçus des valeurs dans les réponses d'introspection ; à désactiver si les aperçus peuvent divulguer des données.
Profondeur BFS pour la détection de cycles ; à augmenter pour les graphes profonds.
Arêtes parcourues lors de la détection de cycles ; à augmenter pour les graphes denses.
Limite de taille par valeur ; les insertions plus grandes échouent immédiatement.
Limite de charge utile totale par canal.
Détecteur d'interblocage pour Shared\Mutex : off, warn (journalise et compte les cycles) ou strict (les rompt avec DeadlockException). Les builds de débogage utilisent strict par défaut.
Fréquence d'analyse du détecteur d'interblocage, en ms.
Troncature par chaîne dans les aperçus, en octets, coupée à une frontière de caractère.
Entrées échantillonnées dans les aperçus /entry.
Exemples de configuration
Des points de départ tirés directement de la documentation — copiez-en un et ajustez.
Lorsque le serveur interne tourne, /config renvoie la configuration résolue au format JSON. Les chemins TLS, INTERNAL_ADDR et ERROR_PAGES_DIR sont masqués dans la réponse.
Zéro configuration est une configuration valide
Chaque valeur par défaut ci-dessus est choisie pour qu'un environnement vide fonctionne tel quel.