Every setting is one environment variable
There are no config files. Every setting is an environment variable, and every variable has a default that holds up in production. Deploy an empty environment, then override only the variables you actually care about.
Anything outside this set — typos like "ture" — fails fast at startup, naming the variable. Empty equals unset: FOO=${FOO} substitutions that produce FOO= fall back to the default instead of refusing to start.
Сервер и воркеры
12 переменныхАдрес и порт основного HTTP-сервера.
Корневой каталог для отдачи файлов и PHP-скриптов.
Единый канонический входной скрипт. Не задан = прямое сопоставление файлов, *.php = фронт-контроллер, не-.php = SPA-фолбэк; в режиме воркеров — бутстрап воркера. Разрешается относительно DOCUMENT_ROOT.
Включает постоянный режим воркеров. Требует, чтобы ENTRY_FILE указывал на .php-скрипт.
Максимальное число одновременных TCP-соединений.
Потоки асинхронного ввода-вывода. 1 = однопоточный режим, N = фиксированное количество, не задано = авто.
Бэкенд исполнения PHP: sapi — настоящий PHP, stub — для бенчмаркинга без PHP.
Размер пула воркеров. N = фиксированный пул, MIN:MAX = динамическое масштабирование, 0 = авто.
Сколько секунд динамический воркер простаивает перед выводом из пула.
Максимум ожидающих запросов в очереди PHP; при заполнении возвращается 529. Для пулов MIN:MAX начальное число воркеров равно минимуму.
Потолок памяти на воркер в МиБ перед его пересозданием. 0 = без ограничений. Пересоздание по требованию через Worker::scheduleExit().
Заполняет $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER и php://input перед каждым скриптом. Ложное значение = только объектный API (oxphp_http_request()).
Трафик и доставка
15 переменныхМаксимум секунд на получение HTTP-заголовков после установки соединения (защита от Slowloris).
Максимум секунд ожидания незавершённых соединений при корректном завершении работы.
Максимум запросов с одного IP за окно. 0 = выключено; при заполненной очереди PHP возвращается 529.
Длительность окна ограничения частоты запросов в секундах.
Путь к PEM-сертификату. Для включения TLS должны быть заданы и TLS_CERT, и TLS_KEY.
Путь к приватному ключу в формате PEM.
Минимальная версия TLS: 1.2 или 1.3. Проверяется при запуске, даже если TLS выключен.
Максимум одновременно открытых потоков на соединение.
Максимум фреймов RST_STREAM в очереди до закрытия соединения (защита от Rapid Reset).
Максимальный суммарный размер декодированных заголовков (в байтах) на запрос.
Интервал между PING-фреймами в секундах; 0 отключает.
Сколько секунд ждать ответа на PING перед закрытием соединения.
Cache-Control: max-age для статических файлов. Принимает 30s, 5m, 2h, 30d, 1w, 1y, число секунд или off. Заменяет STATIC_CACHE_TTL.
Ревалидация по mtime для кэша в памяти — проверяется не чаще одного раза в 3 с на файл. Заменяет STATIC_CACHE.
Качество Brotli 0–11. 0 отключает сжатие.
Безопасность
5 переменныхЗащита от кликджекинга: DENY, SAMEORIGIN или off. Устанавливает X-Frame-Options + CSP frame-ancestors; заголовки, заданные приложением, всегда имеют приоритет.
CIDR доверенных прокси (или private). Реальный IP клиента берётся из Forwarded / X-Forwarded-* по правилу «крайний справа недоверенный».
Glob-шаблоны, чьи .php-файлы никогда не исполняются по прямому URI (/uploads/**). Сопоставляются до обращения к диску — не раскрывают факт существования файла.
Ответ при совпадении с дени-листом: HTTP-статус 400–599 или PHP-скрипт-фолбэк с префиксом / внутри DOCUMENT_ROOT.
Абсолютные пути, внутри которых символические ссылки могут выходить за пределы DOCUMENT_ROOT. Не задано = выход запрещён.
Логи, трассировки и профили
34 переменныхДетализация логов: trace, debug, info, warn, error.
Лог доступа по каждому запросу: all = каждый запрос, error = только 4xx/5xx, не задано = выключено.
Внутренний сервер (/health, /metrics, /config). Значения только с портом привязываются к 127.0.0.1; не задано = не запускается.
Список разрешений в формате CIDR для внутреннего сервера; посторонние получают 403, проверки работоспособности остаются доступны. Loopback не подразумевается по умолчанию.
Каталог с пользовательскими страницами ошибок {status}.html.
Максимальный размер тела запроса (в байтах) для внутренних эндпоинтов запросов (512 КиБ).
Распространение W3C Trace Context: читает traceparent/tracestate и передаёт их в PHP через $_SERVER.
Включает экспорт спанов OpenTelemetry. Подразумевает TRACE_CONTEXT=true.
Протокол экспорта: grpc или http/protobuf.
Эндпоинт OTLP-коллектора.
Таймаут экспорта в миллисекундах.
Заголовки аутентификации: key=value,key2=value2.
Имя сервиса в экспортируемых спанах.
Атрибут версии сервиса.
Дополнительные атрибуты ресурса: env=prod,region=us-east-1.
Стратегия сэмплирования: always_on, always_off, traceidratio и варианты parentbased_*.
Доля сэмплирования 0.0–1.0 для сэмплеров на основе доли; значения вне диапазона усекаются до границ.
APM: автоматическое инструментирование 33 функций PHP (PDO, mysqli, cURL, Redis…), захват ошибок, SDK трассировки. Требует OTEL_ENABLED.
Порог медленного запроса в мс; более медленные запросы к БД получают oxphp.db.slow=true.
Записывает привязанные параметры в спаны db.params. Отключите, если параметры могут содержать конфиденциальные данные.
Главный переключатель. Остальные переменные PROFILER_* всё равно разбираются, поэтому опечатки проявляются при запуске.
Вероятность 0.0–1.0 того, что запрос попадёт в выборку.
Также сэмплировать запросы к внутреннему серверу.
Bearer-токен, необходимый для профилирования по требованию через oxphp_profiler_*().
Лимит спанов на запрос; более длинные профили усекаются.
Максимальная глубина стека вызовов на сэмпл (жёсткий предел 65535).
Каталог для профилей на диске.
Форматы, записываемые на диск: xhprof, speedscope, pprof, flamegraph.
Ограничение частоты записи файлов профилей в секунду.
Максимум хранимых файлов профилей; более старые удаляются.
Удалённый эндпоинт, куда профили отправляются методом POST.
Формат передачи для экспорта.
Bearer-токен, отправляемый с каждым экспортом.
XHGui-совместимая упаковка; не задано = автоопределение по URL.
Асинхронность и разделяемое состояние
19 переменныхВыделенные потоки асинхронных воркеров. 0 = функции зарегистрированы, но при вызове бросают AsyncException.
Максимум ожидающих задач в асинхронной очереди. 0 = авто.
Лимит одновременных файберов задач на воркер; глобальный лимит выполняемых = файберы × воркеры.
Главный переключатель всей подсистемы OxPHP\Shared\*.
Глобальный лимит на все записи Shared; вставки сверх него бросают CapacityException.
Глобальный лимит на оценочный объём памяти по всем записям.
Начинать отбрасывать наименее приоритетную работу после превышения этой доли лимитов.
Включает/отключает экспозицию Prometheus oxphp_shared_*.
Включает/отключает API интроспекции /__ox_shared/*.
Предпросмотр значений в ответах интроспекции; отключите, если предпросмотр может раскрыть данные.
Глубина BFS при проверке циклов; увеличьте для глубоких графов.
Число рёбер, обходимых при проверке циклов; увеличьте для плотных графов.
Лимит размера одного значения; вставки большего размера сразу отклоняются.
Лимит суммарной полезной нагрузки на канал.
Паника внутри замыкания Mutex/Once навсегда «отравляет» примитив вместо восстановления по возможности.
Диагностика конкуренции за блокировки: off, count или trace.
Интервал опроса для сэмплера диагностики блокировок.
Усечение строк в предпросмотрах /entry.
Число элементов, выбираемых в предпросмотрах /entry.
Example configurations
Starting points straight from the docs — copy one and adjust.
With the internal server running, /config returns the resolved configuration as JSON. TLS paths, INTERNAL_ADDR and ERROR_PAGES_DIR are scrubbed from the response.
Zero configuration is a valid configuration
Every default above is chosen so an empty environment just works.