Konfiguracja

Każde ustawienie to jedna zmienna środowiskowa

Każde ustawienie to zmienna środowiskowa — do tego jeden opcjonalny plik, .oxphpdeny, z regułami blokowania ścieżek — a każda zmienna ma wartość domyślną, która sprawdza się na produkcji. Wdróż puste środowisko, a potem nadpisz tylko te zmienne, na których naprawdę Ci zależy.

Wartości logiczne
prawda on true 1 yes fałsz off false 0 no

Wszystko spoza tego zbioru — literówki w rodzaju „ture” — powoduje natychmiastowy błąd przy starcie, ze wskazaniem zmiennej. Pusta wartość znaczy tyle co nieustawiona: podstawienia FOO=${FOO} dające FOO= wracają do wartości domyślnej, zamiast odmówić uruchomienia.

Serwer i workery

15 zmiennych
Zmienna Domyślnie Opis
0.0.0.0:80

Adres i port głównego serwera HTTP.

/var/www/html/public

Katalog główny do serwowania plików i skryptów PHP.

(nieustawione)

Pojedynczy kanoniczny plik wejściowy. Nieustawiony = bezpośrednie mapowanie plików, *.php = front controller, plik inny niż .php = fallback SPA; w trybie worker — bootstrap workera. Rozwiązywany względem DOCUMENT_ROOT.

false

Włącza trwały tryb worker. Wymaga, aby ENTRY_FILE wskazywał na skrypt .php.

10000

Maksymalna liczba jednoczesnych połączeń TCP. Także pułap domyślnego QUEUE_MAX_WAITING (jego połowa); nieprawidłowa wartość to błąd startu. Utrzymuj ją powyżej PHP_WORKERS + QUEUE_CAPACITY + QUEUE_MAX_WAITING.

CPU / 2 (min 1)

Wątki asynchronicznego wejścia-wyjścia. 1 = jednowątkowo, N = stała liczba, nieustawiony = automatycznie. Dzieli rdzenie z PHP_WORKERS — podniesienie do pełnej liczby rdzeni zwykle obniża przepustowość. CPU to liczba rdzeni, na których proces może działać (maska affinity, obniżona do limitu cgroup quota), a nie waga CPU ani limit, który platforma egzekwuje poza kontenerem; wiersz CPU count for default sizing przy uruchamianiu pokazuje, co zostało policzone.

sapi

Backend wykonujący PHP: sapi dla prawdziwego PHP, stub do benchmarkowania bez PHP.

CPU / 2 (min 1)

Rozmiar puli workerów. N = stała pula, MIN:MAX = dynamiczne skalowanie, 0 = automatycznie. Automatyczny dobór liczy CPU tak samo jak TOKIO_WORKERS — na planie, którego limitu CPU kontener nie widzi (cpu_source: host w logu uruchamiania), ustaw obie zmienne jawnie.

30

Liczba sekund bezczynności dynamicznego workera przed jego wycofaniem. Wycofanie czeka na moment bez niczego w toku, więc żądania w trakcie realizacji nigdy nie są ucinane.

workers × 128

Maksymalna liczba oczekujących żądań w kolejce PHP; żądania trafiające na pełną kolejkę czekają do QUEUE_WAIT_TIMEOUT_MS. 0 = automatycznie. Dla pul MIN:MAX początkowa liczba workerów = wartość minimalna.

1000

Górny limit czasu, przez jaki żądanie może czekać na workera PHP przed 529 — jeden termin obejmujący oczekiwanie na miejsce w kolejce i w kolejce. Przy przeciążeniu serwer sam go skraca (do 1/64, min. 10 ms); obowiązującą wartość pokazuje oxphp_admission_wait_budget_us. 0 = odrzucaj w chwili zapełnienia kolejki.

workers × 128, ≤ MAX_CONNECTIONS / 2

Maksymalna liczba żądań zaparkowanych w oczekiwaniu na miejsce w kolejce; powyżej niej natychmiastowe 529. Każdy oczekujący trzyma połączenie i zbuforowane ciało. 0 = automatycznie.

64 MiB

Maksymalna liczba bajtów ciał żądań trzymanych przez zbiór oczekujących; ciało, które by ją przekroczyło, dostaje natychmiastowe 529, żądania bez ciała czekają dalej. 0 = automatycznie.

(nieustawione)

Górny limit pamięci na workera w MiB przed jego recyklingiem. 0 = bez ograniczeń. Workery są też recyklingowane po trzech kolejnych żądaniach zakończonych awarią lub na żądanie przez Worker::scheduleExit().

true

Buduje $_SERVER i $_GET przed każdym skryptem. Wartość fałszywa pomija tę pracę; nie wpływa na $_POST, $_FILES, $_COOKIE ani php://input.

Ruch i dostarczanie

18 zmiennych
Zmienna Domyślnie Opis
5

Maksymalny czas w sekundach na odebranie nagłówków HTTP po nawiązaniu połączenia (ochrona przed Slowloris).

25

Maksymalny czas w sekundach na trwające żądania podczas łagodnego zamknięcia; maruderzy są potem anulowani. Żądanie zablokowane w wywołaniu blokującym może utrzymać proces dłużej.

0 (off)

Maksymalna liczba żądań na IP w oknie. 0 = wyłączone; pełna kolejka PHP odpowiada 529.

60

Czas trwania okna ograniczania liczby żądań w sekundach.

(nieustawione)

Ścieżka do certyfikatu PEM. Aby włączyć TLS, muszą być ustawione zarówno TLS_CERT, jak i TLS_KEY.

(nieustawione)

Ścieżka do klucza prywatnego PEM.

1.2

Minimalna wersja TLS: 1.2 lub 1.3. Weryfikowana przy starcie, nawet gdy TLS jest wyłączony.

PHP_WORKERS_MAX × 4 (min 32)

Maksymalna liczba jednocześnie otwartych strumieni na połączenie.

20

Maksymalna liczba oczekujących ramek RST_STREAM przed zamknięciem połączenia (ochrona przed Rapid Reset).

65536

Maksymalna łączna liczba zdekodowanych bajtów nagłówków na żądanie.

20

Liczba sekund między ramkami PING; 0 wyłącza.

10

Liczba sekund oczekiwania na odpowiedź PING przed zamknięciem połączenia.

30d

Cache-Control: max-age dla plików statycznych. Przyjmuje 30s, 5m, 2h, 30d, 1w, 1y, samą liczbę sekund lub off. Zastępuje STATIC_CACHE_TTL.

off

Ponowna walidacja mtime dla pamięci podręcznej w pamięci — sprawdzana najwyżej co 3 s na plik. Zastępuje STATIC_CACHE.

br,zstd,gzip

Oferowane kodowania treści: br, zstd, gzip. off/none wyłącza kompresję. Kolejność jest ignorowana — buforowane pliki statyczne preferują Brotli, wszystko inne zstd.

5

Jakość Brotli 0–11; 0 wycofuje Brotli. Zastępuje COMPRESSION_LEVEL (którego 0 nadal wyłącza wszystkie kodowania).

6

Poziom Zstandard 0–19; 0 wycofuje zstd. Wartości spoza zakresu przerywają start.

6

Poziom gzip 0–9; 0 wycofuje gzip. Wartości spoza zakresu przerywają start.

Bezpieczeństwo

5 zmiennych
Zmienna Domyślnie Opis
SAMEORIGIN

Ochrona przed clickjackingiem: SAMEORIGIN, DENY lub off. Ustawia X-Frame-Options + CSP frame-ancestors na każdej odpowiedzi; nagłówki ustawione przez aplikację zawsze mają pierwszeństwo. Nieprawidłowe wartości wracają do SAMEORIGIN z ostrzeżeniem przy starcie.

(nieustawione)

Zaufane proxy: rozdzielona przecinkami lista łącząca zakresy CIDR, pojedyncze adresy IP i słowa kluczowe private oraz cloudflare. Rzeczywisty IP klienta z Forwarded / X-Forwarded-* metodą rightmost-non-trusted; przy cloudflare z CF-Connecting-IP, gdy żądanie przyszło przez serwer brzegowy Cloudflare.

(nieustawione)

Wzorce glob, których pliki .php nigdy nie są wykonywane przez bezpośredni URI (/uploads/**). Dopasowywane przed operacjami dyskowymi — nie zdradzają, czy plik istnieje.

404

Odpowiedź przy dopasowaniu do PHP_DENY_PATHS lub do reguły blokującej z .oxphpdeny: status HTTP 400–599 lub skrypt fallback PHP z prefiksem / wewnątrz DOCUMENT_ROOT. W trybie worker reguły blokujące z .oxphpdeny przyjmują wyłącznie kod statusu.

(nieustawione)

Ścieżki bezwzględne, pod którymi dowiązania symboliczne mogą wyjść poza DOCUMENT_ROOT. Nieustawiony = brak dozwolonych wyjść.

Logi, ślady i profile

39 zmiennych
Zmienna Domyślnie Opis
info

Poziom szczegółowości własnej diagnostyki serwera: trace, debug, info, warn, error. Nie filtruje logu dostępu; rozłączenia klientów są logowane na poziomie debug.

(nieustawione)

Rejestrowanie dostępu dla każdego żądania: all = każde żądanie, error = tylko 4xx/5xx, nieustawiony = wyłączone.

(nieustawione)

Serwer wewnętrzny (/health, /metrics, /config). Wartości zawierające tylko port wiążą się z 127.0.0.1; nieustawiony = nieuruchomiony.

(nieustawione)

Lista dozwolonych CIDR dla serwera wewnętrznego; obcy otrzymują 403, sondy kontroli stanu pozostają dostępne. Loopback nie jest domyślny.

(nieustawione)

Katalog z niestandardowymi stronami błędów {status}.html.

524288

Maksymalna liczba bajtów ciała dla wewnętrznych endpointów zapytań (512 KiB).

false

Propagacja W3C Trace Context: odczytuje traceparent/tracestate i przekazuje je do PHP przez $_SERVER.

false

Włącza eksport spanów OpenTelemetry. Implikuje TRACE_CONTEXT=true.

grpc

Protokół eksportu: grpc lub http/protobuf.

localhost:4317 / 4318

Endpoint kolektora OTLP. Przy http/protobuf jest to bazowy URL: spany są wysyłane pod jego ścieżkę /v1/traces.

10000

Limit czasu eksportu w milisekundach. Przy gRPC ogranicza też nawiązywanie połączenia z kolektorem, łącznie z uzgadnianiem TLS, a na Linuksie określa, jak szybko zamykane jest połączenie, które przestało przyjmować dane.

(nieustawione)

Nagłówki uwierzytelniania: key=value,key2=value2.

oxphp

Nazwa usługi w eksportowanych spanach.

(nieustawione)

Atrybut wersji usługi.

(nieustawione)

Dodatkowe atrybuty zasobu: env=prod,region=us-east-1.

parentbased_traceidratio

Strategia próbkowania: always_on, always_off, traceidratio oraz warianty parentbased_*.

1.0

Współczynnik próbkowania 0.0–1.0 dla samplerów opartych na współczynniku; wartości spoza zakresu są przycinane.

false

APM: automatyczne instrumentowanie 34 funkcji PHP (PDO, mysqli, cURL, Redis…), przechwytywanie błędów, SDK śledzenia. Wymaga OTEL_ENABLED. Gdy wyłączone, oxphp_apm_trace() nadal wykonuje swój callback.

100

Próg wolnych zapytań w ms; wolniejsze zapytania do bazy danych otrzymują oxphp.db.slow=true.

false

Zapisuje parametry powiązane w spanach db.params. Zapisywane w postaci surowej (bez maskowania), więc mogą umieścić w śladach dane osobowe — włączaj tylko tam, gdzie to akceptowalne.

8192

Limit atrybutu exception.stacktrace; przycinany od końca. 0 = bez przycinania.

4096

Limit atrybutu exception.message (limit New Relic na atrybut); przycinany od końca. 0 = bez przycinania.

false

Główny przełącznik. Pozostałe zmienne PROFILER_* są nadal parsowane, więc literówki ujawniają się przy starcie.

0.0

Prawdopodobieństwo 0.0–1.0, że żądanie zostanie spróbkowane.

false

Próbkuje także żądania do serwera wewnętrznego.

(nieustawione)

Sekret, który muszą nieść jawne wyzwalacze (nagłówek X-OxPHP-Profile, ciasteczko OXPROF, zapytanie __oxprof), i token Bearer dla /__profiler/*. Nieustawiony = bez tokenu. Próbkowanie i funkcje OxPHP\Profile\* nigdy go nie sprawdzają.

50000

Limit spanów na żądanie; dłuższe profile są przycinane.

0 (no cap)

Maksymalna głębokość zagnieżdżenia rejestrowanych wywołań; czas głębszych wywołań wlicza się do wywołania na granicy. Przycinana do 32.

/tmp/oxphp-profiles

Katalog na profile zapisywane na dysku.

xhprof,speedscope

Formaty zapisywane na dysk: xhprof, speedscope, pprof, flamegraph.

10

Ograniczenie liczby plików profili zapisywanych na sekundę.

100

Maksymalna liczba przechowywanych plików profili; starsze są usuwane.

(nieustawione)

Zdalny endpoint, do którego wysyłane są profile metodą POST.

xhprof

Format transmisji dla eksportów.

(nieustawione)

Token Bearer wysyłany z każdym eksportem.

(auto-detect)

Opakowanie zgodne z XHGui; nieustawiony = automatyczne wykrywanie na podstawie URL.

(auto-detect)

Koperta Buggregator (zawsze xhprof); nieustawiony = automatyczne wykrywanie na podstawie URL. Wyklucza się z PROFILER_EXPORT_XHGUI.

(nieustawione)

app_name Buggregatora do grupowania projektów.

(nieustawione)

Tagi Buggregatora: key=value,key2=value2. Nieprawidłowe tokeny to błąd startu.

Asynchroniczność i stan współdzielony

18 zmiennych
Zmienna Domyślnie Opis
off

Opcjonalne, zawieszające fiber zamienniki blokujących funkcji wbudowanych. Kategorie: sleep (natywne sleep/usleep), streams (blokujące odczyty tcp:// i stream_select), net (nawiązywanie połączeń, uzgadnianie połączeń i odczyty TLS, zapisy czekające na miejsce w buforze, odczyty unix:// / udp:// / udg:// — wymaga streams, tylko Linux). 1/true/all = każda kategoria. Zainstalowany zestaw widoczny jako runtime_hooks w /config.

0 (off)

Dedykowane wątki workerów asynchronicznych. 0 = funkcje zarejestrowane, ale rzucające AsyncException przy wywołaniu.

ASYNC_WORKERS × 64

Maksymalna liczba oczekujących zadań w kolejce asynchronicznej. 0 = automatycznie.

256

Limit współbieżnych Fiberów zadań na workera; globalny limit w locie = Fibery × workery.

true

Główny przełącznik dla całego podsystemu OxPHP\Shared\*. Wyłączony = jego klasy nie są w ogóle rejestrowane; zabezpieczaj przez class_exists().

100000

Globalny limit żywych obiektów Shared (klucze Map się nie liczą); utworzenie obiektu powyżej niego rzuca CapacityException.

1 GiB

Globalny limit szacowanej pamięci obiektów Shared, sprawdzany tylko przy tworzeniu obiektu.

true

Przełącza ekspozycję Prometheus oxphp_shared_*.

true

Przełącza API introspekcji /__ox_shared/*.

true

Podglądy wartości w odpowiedziach introspekcji; wyłącz, jeśli podglądy mogłyby ujawnić dane.

16

Głębokość BFS przy sprawdzaniu cykli; zwiększ dla głębokich grafów.

10000

Liczba krawędzi przechodzonych podczas sprawdzania cykli; zwiększ dla gęstych grafów.

1 MiB

Limit rozmiaru pojedynczej wartości; większe wstawienia szybko kończą się błędem.

64 MiB

Limit łącznego ładunku na kanał.

warn

Detektor zakleszczeń dla Shared\Mutex: off, warn (loguje i zlicza cykle) lub strict (przerywa je przez DeadlockException). Kompilacje debug domyślnie używają strict.

100

Jak często detektor zakleszczeń skanuje, w ms.

256

Przycinanie pojedynczych ciągów znaków w podglądach, w bajtach, z cięciem na granicy znaku.

20

Liczba wpisów próbkowanych w podglądach /entry.

Presety

Przykładowe konfiguracje

Punkty wyjścia prosto z dokumentacji — skopiuj jeden i dostosuj.

# szczegółowe logi podczas programowania
LOG_LEVEL=debug
# zapisuj wszystkie żądania, nie tylko błędy
ACCESS_LOG=all
# jeden worker — wygodny przy debugowaniu
PHP_WORKERS=1
# lokalne /health, /metrics, /config
INTERNAL_ADDR=127.0.0.1:9090
# ponownie czytaj statyki bez restartu
STATIC_REVALIDATE=on
Podejrzyj aktywną konfigurację

Gdy serwer wewnętrzny działa, /config zwraca rozwiązaną konfigurację w formacie JSON. Ścieżki TLS, INTERNAL_ADDR i ERROR_PAGES_DIR są usuwane z odpowiedzi.

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

Zero konfiguracji to też konfiguracja

Każda domyślna wartość powyżej jest dobrana tak, aby puste środowisko po prostu działało.