Configuration

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.

Valeurs booléennes
vrai on true 1 yes faux off false 0 no

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 variables
Variable Par défaut Description
0.0.0.0:80

Adresse et port du serveur HTTP principal.

/var/www/html/public

Répertoire racine pour servir les fichiers et les scripts PHP.

(non défini)

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.

false

Active le mode worker persistant. Nécessite qu'ENTRY_FILE pointe vers un script .php.

10000

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.

CPU / 2 (min 1)

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é.

sapi

Backend d'exécution PHP : sapi pour du vrai PHP, stub pour le benchmark sans PHP.

CPU / 2 (min 1)

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.

30

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.

workers × 128

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.

1000

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.

workers × 128, ≤ MAX_CONNECTIONS / 2

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.

64 Mio

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.

(non défini)

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().

true

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 variables
Variable Par défaut Description
5

Nombre maximal de secondes pour recevoir les en-têtes HTTP après la connexion (protection contre Slowloris).

25

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à.

0 (off)

Nombre maximal de requêtes par IP et par fenêtre. 0 = désactivé ; une file PHP pleine répond 529.

60

Durée de la fenêtre de limitation de débit en secondes.

(non défini)

Chemin vers le certificat PEM. TLS_CERT et TLS_KEY doivent tous deux être définis pour activer TLS.

(non défini)

Chemin vers la clé privée PEM.

1.2

Version TLS minimale : 1.2 ou 1.3. Validée au démarrage même lorsque TLS est désactivé.

PHP_WORKERS_MAX × 4 (min 32)

Nombre maximal de flux ouverts simultanément par connexion.

20

Nombre maximal de trames RST_STREAM en file avant la fermeture de la connexion (protection contre Rapid Reset).

65536

Nombre maximal d'octets d'en-têtes décodés au total par requête.

20

Secondes entre les trames PING ; 0 désactive.

10

Secondes d'attente d'une réponse PING avant la fermeture de la connexion.

30d

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.

off

Revalidation par mtime pour le cache en mémoire — vérifiée au plus toutes les 3 s par fichier. Remplace STATIC_CACHE.

br,zstd,gzip

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.

5

Qualité Brotli 0–11 ; 0 retire Brotli. Remplace COMPRESSION_LEVEL (dont le 0 désactive toujours tous les codages).

6

Niveau Zstandard 0–19 ; 0 retire zstd. Les valeurs hors plage interrompent le démarrage.

6

Niveau gzip 0–9 ; 0 retire gzip. Les valeurs hors plage interrompent le démarrage.

Sécurité

5 variables
Variable Par défaut Description
SAMEORIGIN

Protection 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.

(non défini)

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.

(non défini)

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.

404

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.

(non défini)

Chemins absolus sous lesquels les liens symboliques peuvent sortir de DOCUMENT_ROOT. Non défini = aucune sortie autorisée.

Journaux, traces et profils

39 variables
Variable Par défaut Description
info

Verbosité 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.

(non défini)

Journal d'accès par requête : all = chaque requête, error = uniquement 4xx/5xx, non défini = désactivé.

(non défini)

Serveur interne (/health, /metrics, /config). Les valeurs à port seul écoutent sur 127.0.0.1 ; non défini = non démarré.

(non défini)

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.

(non défini)

Répertoire contenant des pages d'erreur {status}.html personnalisées.

524288

Nombre maximal d'octets de corps pour les endpoints de requête internes (512 Kio).

false

Propagation W3C Trace Context : lit traceparent/tracestate et les transmet à PHP via $_SERVER.

false

Active l'export des spans OpenTelemetry. Implique TRACE_CONTEXT=true.

grpc

Protocole d'export : grpc ou http/protobuf.

localhost:4317 / 4318

Endpoint du collecteur OTLP. Avec http/protobuf, c'est une URL de base : les spans sont envoyés à /v1/traces sous celle-ci.

10000

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.

(non défini)

En-têtes d'authentification : key=value,key2=value2.

oxphp

Nom du service dans les spans exportés.

(non défini)

Attribut de version du service.

(non défini)

Attributs de ressource supplémentaires : env=prod,region=us-east-1.

parentbased_traceidratio

Stratégie d'échantillonnage : always_on, always_off, traceidratio et les variantes parentbased_*.

1.0

Ratio d'échantillonnage 0.0–1.0 pour les échantillonneurs basés sur un ratio ; les valeurs hors plage sont bornées.

false

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.

100

Seuil de requête lente en ms ; les requêtes de base de données plus lentes reçoivent oxphp.db.slow=true.

false

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.

8192

Limite de l'attribut exception.stacktrace ; tronqué par la fin. 0 = aucune troncature.

4096

Limite de l'attribut exception.message (limite par attribut de New Relic) ; tronqué par la fin. 0 = aucune troncature.

false

Interrupteur principal. Les autres variables PROFILER_* sont tout de même analysées, de sorte que les fautes de frappe apparaissent au démarrage.

0.0

Probabilité 0.0–1.0 qu'une requête soit échantillonnée.

false

Échantillonne aussi les requêtes vers le serveur interne.

(non défini)

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.

50000

Limite de spans par requête ; les profils plus longs sont tronqués.

0 (no cap)

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.

/tmp/oxphp-profiles

Répertoire pour les profils sur disque.

xhprof,speedscope

Formats écrits sur disque : xhprof, speedscope, pprof, flamegraph.

10

Limite de débit sur le nombre de fichiers de profil écrits par seconde.

100

Nombre maximal de fichiers de profil conservés ; les plus anciens sont supprimés.

(non défini)

Endpoint distant vers lequel envoyer les profils en POST.

xhprof

Format de transmission pour les exports.

(non défini)

Jeton Bearer envoyé avec chaque export.

(auto-detect)

Enveloppe compatible XHGui ; non défini = détection automatique à partir de l'URL.

(auto-detect)

Enveloppe Buggregator (toujours xhprof) ; non défini = détection automatique à partir de l'URL. Mutuellement exclusif avec PROFILER_EXPORT_XHGUI.

(non défini)

app_name Buggregator pour le regroupement par projet.

(non défini)

Tags Buggregator : key=value,key2=value2. Les jetons malformés sont une erreur au démarrage.

Asynchrone et état partagé

18 variables
Variable Par défaut Description
off

Remplacements 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.

0 (off)

Threads worker asynchrones dédiés. 0 = fonctions enregistrées mais levant AsyncException à l'appel.

ASYNC_WORKERS × 64

Nombre maximal de tâches en attente dans la file asynchrone. 0 = auto.

256

Limite par worker de Fibers de tâches concurrentes ; limite globale en cours = Fibers × workers.

true

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().

100000

Limite globale sur les objets Shared vivants (les clés de Map ne comptent pas) ; en créer un au-delà lève CapacityException.

1 GiB

Limite globale sur la mémoire estimée des objets Shared, vérifiée uniquement à la création d'un objet.

true

Active ou désactive l'exposition Prometheus oxphp_shared_*.

true

Active ou désactive l'API d'introspection /__ox_shared/*.

true

Aperçus des valeurs dans les réponses d'introspection ; à désactiver si les aperçus peuvent divulguer des données.

16

Profondeur BFS pour la détection de cycles ; à augmenter pour les graphes profonds.

10000

Arêtes parcourues lors de la détection de cycles ; à augmenter pour les graphes denses.

1 MiB

Limite de taille par valeur ; les insertions plus grandes échouent immédiatement.

64 MiB

Limite de charge utile totale par canal.

warn

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.

100

Fréquence d'analyse du détecteur d'interblocage, en ms.

256

Troncature par chaîne dans les aperçus, en octets, coupée à une frontière de caractère.

20

Entrées échantillonnées dans les aperçus /entry.

Préréglages

Exemples de configuration

Des points de départ tirés directement de la documentation — copiez-en un et ajustez.

# logs détaillés pendant le développement
LOG_LEVEL=debug
# journaliser toutes les requêtes, pas que les erreurs
ACCESS_LOG=all
# un seul worker — pratique pour le débogage
PHP_WORKERS=1
# /health, /metrics, /config en local
INTERNAL_ADDR=127.0.0.1:9090
# relire les fichiers statiques sans redémarrage
STATIC_REVALIDATE=on
Inspecter la configuration active

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.

curl -s http://localhost:9090/config | jq .

Zéro configuration est une configuration valide

Chaque valeur par défaut ci-dessus est choisie pour qu'un environnement vide fonctionne tel quel.