Конфигурация

Каждая настройка — одна переменная окружения

Каждая настройка — это переменная окружения (плюс один необязательный файл, .oxphpdeny, для правил запрета путей), и у каждой переменной есть значение по умолчанию, рассчитанное на production. Начните с пустого окружения, а затем переопределяйте только те переменные, которые действительно важны для вашего приложения.

Логические значения
истинные on true 1 yes ложные off false 0 no

Всё, что не входит в этот набор — например, опечатки вроде «ture», — сразу приводит к ошибке при запуске с указанием переменной. Пустое значение равносильно незаданному: подстановки FOO=${FOO}, дающие FOO=, используют значение по умолчанию, а не прерывают запуск.

Сервер и воркеры

15 переменных
Переменная По умолчанию Описание
0.0.0.0:80

Адрес и порт основного HTTP-сервера.

/var/www/html/public

Корневой каталог для отдачи файлов и PHP-скриптов.

(не задано)

Единый канонический входной скрипт. Не задан = прямое сопоставление файлов, *.php = фронт-контроллер, не-.php = SPA-фолбэк; в режиме воркеров — бутстрап воркера. Разрешается относительно DOCUMENT_ROOT.

false

Включает постоянный режим воркеров. Требует, чтобы ENTRY_FILE указывал на .php-скрипт.

10000

Максимальное число одновременных TCP-соединений. Также потолок для QUEUE_MAX_WAITING по умолчанию (его половина); некорректное значение — ошибка при запуске. Держите его выше PHP_WORKERS + QUEUE_CAPACITY + QUEUE_MAX_WAITING.

CPU / 2 (min 1)

Потоки асинхронного ввода-вывода. 1 = однопоточный режим, N = фиксированное количество, не задано = авто. Делит ядра с PHP_WORKERS — поднятие до полного числа ядер обычно снижает пропускную способность. CPU — это число ядер, на которых может выполняться процесс (маска привязки к CPU, урезанная до квоты cgroup), а не вес CPU и не лимит, который платформа применяет вне контейнера; что именно было посчитано, показывает строка запуска CPU count for default sizing.

sapi

Бэкенд исполнения PHP: sapi — настоящий PHP, stub — для бенчмаркинга без PHP.

CPU / 2 (min 1)

Размер пула воркеров. N = фиксированный пул, MIN:MAX = динамическое масштабирование, 0 = авто. Авторазмер считает CPU так же, как TOKIO_WORKERS, — на тарифе, чей лимит CPU контейнер не видит (cpu_source: host в логе запуска), задайте обе переменные явно.

30

Сколько секунд динамический воркер простаивает перед выводом из пула. Вывод ждёт момента, когда в обработке ничего нет, поэтому выполняющиеся запросы никогда не обрываются.

workers × 128

Максимум ожидающих запросов в очереди PHP; пришедшие в заполненную очередь ждут до QUEUE_WAIT_TIMEOUT_MS. 0 = авто. Для пулов MIN:MAX начальное число воркеров равно минимуму.

1000

Верхний предел того, сколько запрос может ждать PHP-воркера до 529 — один дедлайн, покрывающий ожидание слота очереди и ожидание в самой очереди. При перегрузке сервер сам сокращает его (до 1/64, минимум 10 мс); действующее значение показывает oxphp_admission_wait_budget_us. 0 = отклонять сразу, как только очередь заполнена.

workers × 128, ≤ MAX_CONNECTIONS / 2

Максимум запросов, припаркованных в ожидании слота очереди; сверх него — немедленный 529. Каждый ожидающий удерживает соединение и своё буферизованное тело. 0 = авто.

64 МиБ

Максимум байтов тел запросов у множества ожидающих; тело, которое превысило бы предел, получает немедленный 529, запросы без тела продолжают ждать. 0 = авто.

(не задано)

Потолок памяти на воркер в МиБ перед его пересозданием. 0 = без ограничений. Воркеры также пересоздаются после трёх подряд запросов, завершившихся сбоем, или по требованию через Worker::scheduleExit().

true

Строит $_SERVER и $_GET перед каждым скриптом. Ложное значение пропускает эту работу; $_POST, $_FILES, $_COOKIE и php://input не затрагиваются.

Трафик и доставка

18 переменных
Переменная По умолчанию Описание
5

Максимум секунд на получение HTTP-заголовков после установки соединения (защита от Slowloris).

25

Максимум секунд на незавершённые запросы при корректном завершении работы; оставшиеся затем отменяются. Запрос, застрявший в блокирующем вызове, может удержать процесс дольше.

0 (off)

Максимум запросов с одного IP за окно. 0 = выключено; при заполненной очереди PHP возвращается 529.

60

Длительность окна ограничения частоты запросов в секундах.

(не задано)

Путь к PEM-сертификату. Для включения TLS должны быть заданы и TLS_CERT, и TLS_KEY.

(не задано)

Путь к приватному ключу в формате PEM.

1.2

Минимальная версия TLS: 1.2 или 1.3. Проверяется при запуске, даже если TLS выключен.

PHP_WORKERS_MAX × 4 (min 32)

Максимум одновременно открытых потоков на соединение.

20

Максимум фреймов RST_STREAM в очереди до закрытия соединения (защита от Rapid Reset).

65536

Максимальный суммарный размер декодированных заголовков (в байтах) на запрос.

20

Интервал между PING-фреймами в секундах; 0 отключает.

10

Сколько секунд ждать ответа на PING перед закрытием соединения.

30d

Cache-Control: max-age для статических файлов. Принимает 30s, 5m, 2h, 30d, 1w, 1y, число секунд или off. Заменяет STATIC_CACHE_TTL.

off

Ревалидация по mtime для кэша в памяти — проверяется не чаще одного раза в 3 с на файл. Заменяет STATIC_CACHE.

br,zstd,gzip

Предлагаемые кодировки сжатия: br, zstd, gzip. off/none отключает сжатие. Порядок не учитывается — кэшированные статические файлы предпочитают Brotli, всё остальное — zstd.

5

Качество Brotli 0–11; 0 отключает Brotli. Заменяет COMPRESSION_LEVEL (его 0 по-прежнему отключает все кодировки).

6

Уровень Zstandard 0–19; 0 отключает zstd. Значения вне диапазона прерывают запуск.

6

Уровень gzip 0–9; 0 отключает gzip. Значения вне диапазона прерывают запуск.

Безопасность

5 переменных
Переменная По умолчанию Описание
SAMEORIGIN

Защита от кликджекинга: SAMEORIGIN, DENY или off. Устанавливает X-Frame-Options + CSP frame-ancestors на каждом ответе; заголовки, заданные приложением, всегда имеют приоритет. Недопустимые значения откатываются к SAMEORIGIN с предупреждением при запуске.

(не задано)

Доверенные прокси: список через запятую из CIDR, одиночных IP и ключевых слов private и cloudflare. Реальный IP клиента берётся из Forwarded / X-Forwarded-* по правилу «крайний справа недоверенный»; с cloudflare — из CF-Connecting-IP, если запрос пришёл через edge-узел Cloudflare.

(не задано)

Glob-шаблоны, чьи .php-файлы никогда не исполняются по прямому URI (/uploads/**). Сопоставляются до обращения к диску — не раскрывают факт существования файла.

404

Ответ при совпадении с PHP_DENY_PATHS или с запрещающим правилом .oxphpdeny: HTTP-статус 400–599 или PHP-скрипт-фолбэк с префиксом / внутри DOCUMENT_ROOT. В режиме воркеров запрещающие правила .oxphpdeny принимают только код статуса.

(не задано)

Абсолютные пути, внутри которых символические ссылки могут выходить за пределы DOCUMENT_ROOT. Не задано = выход запрещён.

Логи, трассировки и профили

39 переменных
Переменная По умолчанию Описание
info

Детализация собственной диагностики сервера: trace, debug, info, warn, error. Не фильтрует лог доступа; разрывы соединения клиентом пишутся на уровне debug.

(не задано)

Лог доступа по каждому запросу: all = каждый запрос, error = только 4xx/5xx, не задано = выключено.

(не задано)

Внутренний сервер (/health, /metrics, /config). Значения только с портом привязываются к 127.0.0.1; не задано = не запускается.

(не задано)

Список разрешений в формате CIDR для внутреннего сервера; посторонние получают 403, проверки работоспособности остаются доступны. Loopback не подразумевается по умолчанию.

(не задано)

Каталог с пользовательскими страницами ошибок {status}.html.

524288

Максимальный размер тела запроса (в байтах) для внутренних эндпоинтов запросов (512 КиБ).

false

Распространение W3C Trace Context: читает traceparent/tracestate и передаёт их в PHP через $_SERVER.

false

Включает экспорт спанов OpenTelemetry. Подразумевает TRACE_CONTEXT=true.

grpc

Протокол экспорта: grpc или http/protobuf.

localhost:4317 / 4318

Эндпоинт OTLP-коллектора. При http/protobuf это базовый URL: спаны отправляются на /v1/traces под ним.

10000

Таймаут экспорта в миллисекундах. По gRPC он также ограничивает подключение к коллектору, включая TLS-рукопожатие, а в Linux задаёт, как скоро закрывается соединение, переставшее принимать данные.

(не задано)

Заголовки аутентификации: key=value,key2=value2.

oxphp

Имя сервиса в экспортируемых спанах.

(не задано)

Атрибут версии сервиса.

(не задано)

Дополнительные атрибуты ресурса: env=prod,region=us-east-1.

parentbased_traceidratio

Стратегия сэмплирования: always_on, always_off, traceidratio и варианты parentbased_*.

1.0

Доля сэмплирования 0.0–1.0 для сэмплеров на основе доли; значения вне диапазона усекаются до границ.

false

APM: автоматическое инструментирование 34 функций PHP (PDO, mysqli, cURL, Redis…), захват ошибок, SDK трассировки. Требует OTEL_ENABLED. Когда выключено, oxphp_apm_trace() всё равно выполняет свой колбэк.

100

Порог медленного запроса в мс; более медленные запросы к БД получают oxphp.db.slow=true.

false

Записывает привязанные параметры в спаны db.params. Записываются как есть (без обфускации), поэтому в трассировки могут попасть персональные данные — включайте только там, где это приемлемо.

8192

Лимит атрибута exception.stacktrace; усекается с конца. 0 = без усечения.

4096

Лимит атрибута exception.message (предел New Relic на атрибут); усекается с конца. 0 = без усечения.

false

Главный переключатель. Остальные переменные PROFILER_* всё равно разбираются, поэтому опечатки проявляются при запуске.

0.0

Вероятность 0.0–1.0 того, что запрос попадёт в выборку.

false

Также сэмплировать запросы к внутреннему серверу.

(не задано)

Секрет, который должны нести явные триггеры (заголовок X-OxPHP-Profile, cookie OXPROF, параметр запроса __oxprof), и bearer-токен для /__profiler/*. Не задано = без токена. Сэмплирование и функции OxPHP\Profile\* его никогда не проверяют.

50000

Лимит спанов на запрос; более длинные профили усекаются.

0 (no cap)

Максимальная глубина вложенности записываемых вызовов; время более глубоких вызовов сворачивается в вызов на пределе. Ограничивается значением 32.

/tmp/oxphp-profiles

Каталог для профилей на диске.

xhprof,speedscope

Форматы, записываемые на диск: xhprof, speedscope, pprof, flamegraph.

10

Ограничение частоты записи файлов профилей в секунду.

100

Максимум хранимых файлов профилей; более старые удаляются.

(не задано)

Удалённый эндпоинт, куда профили отправляются методом POST.

xhprof

Формат передачи для экспорта.

(не задано)

Bearer-токен, отправляемый с каждым экспортом.

(auto-detect)

XHGui-совместимая упаковка; не задано = автоопределение по URL.

(auto-detect)

Конверт Buggregator (всегда xhprof); не задано = автоопределение по URL. Взаимоисключается с PROFILER_EXPORT_XHGUI.

(не задано)

app_name Buggregator для группировки по проектам.

(не задано)

Теги Buggregator: key=value,key2=value2. Некорректные токены — ошибка при запуске.

Асинхронность и разделяемое состояние

18 переменных
Переменная По умолчанию Описание
off

Включаемые по желанию замены блокирующих встроенных функций, приостанавливающие файбер. Категории: sleep (нативные sleep/usleep), streams (блокирующие чтения tcp:// и stream_select), net (установка соединений, TLS-рукопожатия и чтения по TLS, записи в ожидании места в буфере, чтения unix:// / udp:// / udg:// — требует streams, только Linux). 1/true/all = все категории. Установленный набор показывается как runtime_hooks в /config.

0 (off)

Выделенные потоки асинхронных воркеров. 0 = функции зарегистрированы, но при вызове бросают AsyncException.

ASYNC_WORKERS × 64

Максимум ожидающих задач в асинхронной очереди. 0 = авто.

256

Лимит одновременных файберов задач на воркер; глобальный лимит выполняемых = файберы × воркеры.

true

Главный переключатель всей подсистемы OxPHP\Shared\*. Выключено = её классы вообще не регистрируются; проверяйте через class_exists().

100000

Глобальный лимит на живые объекты Shared (ключи Map не учитываются); создание объекта сверх него бросает CapacityException.

1 GiB

Глобальный лимит на оценочный объём памяти по объектам Shared; проверяется только при создании объекта.

true

Включает/отключает экспозицию Prometheus oxphp_shared_*.

true

Включает/отключает API интроспекции /__ox_shared/*.

true

Предпросмотр значений в ответах интроспекции; отключите, если предпросмотр может раскрыть данные.

16

Глубина BFS при проверке циклов; увеличьте для глубоких графов.

10000

Число рёбер, обходимых при проверке циклов; увеличьте для плотных графов.

1 MiB

Лимит размера одного значения; вставки большего размера сразу отклоняются.

64 MiB

Лимит суммарной полезной нагрузки на канал.

warn

Детектор взаимоблокировок для Shared\Mutex: off, warn (логировать и считать циклы) или strict (разрывать их через DeadlockException). В отладочных сборках по умолчанию strict.

100

Как часто детектор взаимоблокировок выполняет сканирование, в мс.

256

Усечение строк в предпросмотрах, в байтах, по границе символа.

20

Число элементов, выбираемых в предпросмотрах /entry.

Пресеты

Примеры конфигураций

Отправные точки прямо из документации — скопируйте одну и подстройте под себя.

# подробные логи при разработке
LOG_LEVEL=debug
# писать все запросы, не только ошибки
ACCESS_LOG=all
# один воркер — удобно для отладки
PHP_WORKERS=1
# локальные /health, /metrics, /config
INTERNAL_ADDR=127.0.0.1:9090
# перечитывать статику без перезапуска
STATIC_REVALIDATE=on
Посмотреть действующую конфигурацию

Когда внутренний сервер запущен, /config возвращает итоговую конфигурацию в формате JSON. Пути к TLS, INTERNAL_ADDR и ERROR_PAGES_DIR в ответе скрыты.

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

Нулевая конфигурация — тоже конфигурация

Все значения по умолчанию выше подобраны так, чтобы пустое окружение просто работало.