Справочник по конфигурации
OxPHP полностью настраивается через переменные окружения. Никаких конфигурационных файлов вести не нужно, а у каждой настройки есть значение по умолчанию, поэтому развёртывание без какой-либо конфигурации работает сразу из коробки.
Булевы значения
Переменные, помеченные как булевы, принимают фиксированный канонический набор значений — без учёта регистра и с обрезкой пробелов:
- истинные:
on,true,1,yes - ложные:
off,false,0,no
Любое непустое значение вне этого набора — например, опечатка вроде ture — приводит к немедленной ошибке при запуске с указанием имени переменной. Так ошибочная конфигурация отлавливается до того, как пойдёт трафик, а не приводит к молчаливому выставлению флага не в ту сторону.
Неустановленная переменная или пустое присваивание (FOO=) откатывается к задокументированному значению по умолчанию. Пустое значение намеренно трактуется как неустановленное: подстановка в Docker Compose / Kubernetes вида FOO=${FOO} даёт FOO=, когда переменной на хосте нет, и это не должно мешать серверу запускаться.
Сервер
| Переменная | По умолчанию | Описание |
|---|---|---|
LISTEN_ADDR |
0.0.0.0:80 |
Адрес и порт основного HTTP-сервера |
DOCUMENT_ROOT |
/var/www/html/public |
Корневой каталог для отдачи файлов и PHP-скриптов |
ENTRY_FILE |
(не задано) | Единственный канонический входной файл. Не задано = прямое отображение файлов. *.php = фронт-контроллер. Не-.php = статический фолбэк (SPA). При WORKER_MODE_ENABLED=true = bootstrap-скрипт воркера. Разрешается относительно DOCUMENT_ROOT (относительные пути и .. допускаются; абсолютные пути используются как есть). См. Маршрутизация |
WORKER_MODE_ENABLED |
false |
Включает постоянный режим воркеров. Требует, чтобы ENTRY_FILE указывал на .php-скрипт. Булево — см. Булевы значения |
MAX_CONNECTIONS |
10000 |
Максимальное число одновременных TCP-соединений |
TOKIO_WORKERS |
CPU / 2 (мин. 1) | Потоки асинхронного ввода-вывода. 1 = однопоточный режим, N > 1 = фиксированное число потоков, не задано = автоматически (CPU / 2, мин. 1) |
PHP-воркеры
| Переменная | По умолчанию | Описание |
|---|---|---|
EXECUTOR |
sapi |
Бэкенд-исполнитель PHP. sapi — исполнение PHP, stub — для бенчмаркинга без PHP |
PHP_WORKERS |
CPU / 2 (мин. 1) | Размер пула воркеров. N = фиксированный пул, MIN:MAX = динамическое масштабирование, 0 = автоматически |
PHP_WORKERS_IDLE_SECONDS |
30 |
Сколько секунд динамический воркер остаётся простаивающим, прежде чем будет выведен из пула (только в динамическом режиме) |
QUEUE_CAPACITY |
Начальное число воркеров × 128 | Максимальное число ожидающих запросов в очереди PHP. При заполнении возвращает 529. Для динамических пулов (MIN:MAX) начальное число воркеров = минимальное значение |
Статические и динамические воркеры
Укажите в PHP_WORKERS одно число для фиксированного пула:
PHP_WORKERS=8 # Fixed 8 workers
PHP_WORKERS=0 # Auto-detect: CPU / 2 (min 1)Укажите в PHP_WORKERS значение MIN:MAX для автоматического масштабирования:
PHP_WORKERS=2:16 # Scale between 2 and 16 workers
PHP_WORKERS=4:0 # 4 minimum, auto-detect maximum (CPU × 2)
PHP_WORKERS=0:16 # auto-detect minimum (CPU / 4, min 1), 16 maximumВ динамическом режиме OxPHP увеличивает число воркеров, когда все они заняты, и уменьшает его, когда воркеры простаивают дольше PHP_WORKERS_IDLE_SECONDS.
Режим воркеров
| Переменная | По умолчанию | Описание |
|---|---|---|
WORKER_MAX_MEMORY_MIB |
0 |
Максимальный объём памяти в MiB на один воркер до его пересоздания. 0 = без ограничения |
Установите WORKER_MODE_ENABLED=true и укажите в ENTRY_FILE bootstrap-скрипт воркера (например, ENTRY_FILE=worker.php или ENTRY_FILE=../worker.php). PHP-процессы тогда остаются живыми между запросами, сохраняя в памяти состояние инициализации (автозагрузчики, соединения с базой данных). Воркеры пересоздаются автоматически, когда превышают WORKER_MAX_MEMORY_MIB, или по требованию, когда приложение вызывает Worker::scheduleExit(). Параметр WORKER_MAX_REQUESTS из ранних выпусков объявлен устаревшим и игнорируется — не задавайте ни его, ни аналог, либо перейдите на Worker::scheduleExit().
Устаревшие: INDEX_FILE и WORKER_FILE
Устаревшие переменные INDEX_FILE и WORKER_FILE по-прежнему разбираются ради обратной совместимости. Если они заданы, при запуске выводится строка лога уровня WARN, и они отображаются на новую модель:
| Устаревшая форма | Современный эквивалент |
|---|---|
INDEX_FILE=index.php |
ENTRY_FILE=index.php |
INDEX_FILE=index.html |
ENTRY_FILE=index.html |
WORKER_FILE=/path/worker.php |
WORKER_MODE_ENABLED=true ENTRY_FILE=/path/worker.php |
Если заданы и старые, и новые переменные, приоритет за ENTRY_FILE / WORKER_MODE_ENABLED. Переходите на них, когда вам удобно; устаревшие формы будут удалены в одном из будущих выпусков.
SAPI / PHP
| Переменная | По умолчанию | Описание |
|---|---|---|
SUPERGLOBALS_ENABLED |
true |
Заполняет суперглобальные переменные PHP ($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER, php://input) перед выполнением скрипта. Установите ложное значение, чтобы пропустить заполнение — тогда данные запроса доступны только через объектный API (oxphp_http_request()). Полезно для приложений, которые работают напрямую с объектным API и хотят избежать затрат на построение суперглобальных переменных на каждом запросе |
Таймауты
| Переменная | По умолчанию | Описание |
|---|---|---|
HEADER_TIMEOUT_SECONDS |
5 |
Максимальное число секунд на приём HTTP-заголовков после установки соединения (защита от Slowloris) |
DRAIN_TIMEOUT_SECONDS |
25 |
Максимальное число секунд ожидания завершения текущих соединений при корректном завершении работы |
Время выполнения PHP ограничивается собственной ini-директивой PHP max_execution_time (и вызовом set_time_limit() во время выполнения), а не переменной окружения OxPHP.
Ограничение частоты запросов
| Переменная | По умолчанию | Описание |
|---|---|---|
RATE_LIMIT |
0 (выкл.) |
Максимальное число запросов с одного IP за временное окно. 0 отключает ограничение частоты запросов |
RATE_WINDOW_SECONDS |
60 |
Длительность окна ограничения частоты запросов в секундах |
Безопасность
| Переменная | По умолчанию | Описание |
|---|---|---|
FRAME_OPTIONS |
DENY |
Защита от кликджекинга. DENY полностью запрещает встраивание во фреймы, SAMEORIGIN разрешает встраивание в рамках того же источника, off отключает защиту (используйте, когда управляете встраиванием через собственный CSP). Устанавливает одновременно X-Frame-Options и Content-Security-Policy: frame-ancestors. Заголовки безопасности от сервера служат фолбэком: значения, заданные приложением (например, через PHP header()), имеют приоритет и никогда не перезаписываются. Пара заголовков управления фреймингом связана в обе стороны — заданный приложением X-Frame-Options подавляет серверный Content-Security-Policy: frame-ancestors (в современных браузерах CSP переопределяет X-Frame-Options), а CSP от приложения, содержащий директиву frame-ancestors, подавляет серверный X-Frame-Options. Учтите, что этот приоритет распространяется и на X-Content-Type-Options: заданное приложением значение сохраняется как есть, хотя единственно допустимое значение — nosniff; недопустимое значение отключает защиту |
TRUSTED_PROXIES |
(не задано) | Сети доверенных обратных прокси (CIDR через запятую или private). Если задано, OxPHP извлекает реальный IP клиента из заголовков Forwarded (RFC 7239) или X-Forwarded-For по алгоритму «крайний правый недоверенный». Также обрабатывает X-Forwarded-Proto и X-Forwarded-Host для $_SERVER['HTTPS'], REQUEST_SCHEME, SERVER_NAME и SERVER_PORT. Не задано = функция отключена |
PHP_DENY_PATHS |
(не задано) | Glob-шаблоны через запятую, чьи .php-файлы никогда не должны выполняться по прямому URI (например, /uploads/**,/cache/**,/admin/legacy.php). Шаблоны могут указывать на целые каталоги или отдельные файлы. Применяется в режимах прямого отображения — Traditional и SPA; в режимах Framework и Worker, которые никогда не выполняют произвольные .php-файлы напрямую, игнорируется с предупреждением при запуске. Также охватывает скрипты, доступные через разрешение индексного файла каталога (/uploads/ → uploads/index.php). Для прямых .php-URI сопоставление происходит до обращения к диску, поэтому запрещённые пути дают одинаковый ответ независимо от того, существует файл или нет (без «оракула существования»). Устаревшее имя PHP_DENY_DIRS принимается как устаревший псевдоним и вызывает WARN при запуске. См. Дени-лист исполнения PHP |
PHP_DENY_FALLBACK |
404 |
Что возвращать при совпадении с PHP_DENY_PATHS. Либо HTTP-статус 400–599 (в паре с ERROR_PAGES_DIR для собственного HTML), либо URI-путь с ведущим / к PHP-скрипту-фолбэку внутри DOCUMENT_ROOT. Скрипт-фолбэк получает OXPHP_DENIED_PATH и OXPHP_DENIED_PATTERN в $_SERVER. Проверяется при запуске: скрипт должен существовать, канонизироваться внутри DOCUMENT_ROOT и сам не должен совпадать с PHP_DENY_PATHS (для предотвращения зацикливания) |
SYMLINK_ALLOW_PATHS |
(не задано) | Список абсолютных путей через запятую, под которыми символическим ссылкам разрешено выходить за пределы DOCUMENT_ROOT. Каждый элемент должен уже существовать на диске; относительные и несуществующие пути прерывают запуск. Не задано = выход по символическим ссылкам запрещён. См. Разрешённые пути для симлинков |
Специальное значение private разворачивается во все частные сети RFC-1918, loopback- и link-local-адреса (IPv4 и IPv6): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16, ::1/128, fc00::/7, fe80::/10.
TLS
| Переменная | По умолчанию | Описание |
|---|---|---|
TLS_CERT |
(не задано) | Путь к TLS-сертификату в кодировке PEM. Для включения TLS должны быть заданы и TLS_CERT, и TLS_KEY |
TLS_KEY |
(не задано) | Путь к закрытому TLS-ключу в кодировке PEM |
TLS_MIN_VERSION |
1.2 |
Минимальная принимаемая версия протокола TLS: 1.2 или 1.3. Проверяется при запуске (и командой oxphp config --check) даже когда TLS не включён — любое другое значение, включая последовательности байтов вне UTF-8, приводит к жёсткой ошибке при запуске. Пустое значение трактуется как неустановленное |
HTTP/2
| Переменная | По умолчанию | Описание |
|---|---|---|
H2_MAX_CONCURRENT_STREAMS |
PHP_WORKERS_MAX × 4 (мин. 32) |
Максимальное число одновременно открытых потоков на одно HTTP/2-соединение |
H2_MAX_PENDING_RESET |
20 |
Максимальное число кадров RST_STREAM в очереди до закрытия соединения (защита от Rapid Reset) |
H2_MAX_HEADER_LIST_BYTES |
65536 |
Максимальный суммарный размер декодированных заголовков на один запрос в байтах |
H2_KEEPALIVE_INTERVAL_SECS |
20 |
Число секунд между HTTP/2-кадрами PING; 0 отключает |
H2_KEEPALIVE_TIMEOUT_SECS |
10 |
Число секунд ожидания ответа на PING до закрытия соединения |
Статические файлы
| Переменная | По умолчанию | Описание |
|---|---|---|
STATIC_MAX_AGE |
30d |
Cache-Control: max-age для статических файлов. Принимает: 30s, 5m, 2h, 30d, 1w, 1y, число секунд без суффикса (3600) или off для отключения заголовка. Заменяет устаревшую STATIC_CACHE_TTL. |
STATIC_REVALIDATE |
off |
Булево — см. Булевы значения. Установите истинное значение, чтобы включить ревалидацию по mtime для кэша содержимого в памяти: время изменения файла перепроверяется не чаще одного раза в 3 секунды на файл (а не на запрос), а устаревшие записи вытесняются автоматически, так что изменения становятся видны в течение 3 секунд. Заменяет устаревшую STATIC_CACHE (где off имело обратный смысл). |
COMPRESSION_LEVEL |
4 |
Качество сжатия Brotli (0–11). 0 отключает сжатие |
Логирование
| Переменная | По умолчанию | Описание |
|---|---|---|
LOG_LEVEL |
info |
Уровень детализации логов: trace, debug, info, warn, error |
ACCESS_LOG |
(не задано) | Журнал доступа по каждому запросу: all = каждый запрос, error = только 4xx/5xx, не задано = выключено |
ACCESS_LOG принимает all или error. Оставьте её неустановленной, чтобы полностью отключить журнал доступа.
Наблюдаемость
| Переменная | По умолчанию | Описание |
|---|---|---|
INTERNAL_ADDR |
(не задано) | Адрес внутреннего сервера (/health, /metrics, /config). Если не задано, внутренний сервер не запускается. Значение только с портом (:9090 или 9090) привязывается к 127.0.0.1; чтобы открыть его наружу, укажите явный 0.0.0.0:9090 |
INTERNAL_ALLOW_IPS |
(не задано) | Список разрешений в формате CIDR/IP через запятую для внутреннего сервера. Узел вне списка получает 403 на /metrics, /config и путях плагинов; проверки работоспособности (/health, /healthz, /readyz, /startupz и их длинные формы) остаются доступны. Не задано/пусто = разрешены все. Loopback не подразумевается неявно — укажите 127.0.0.1/32, чтобы сохранить доступ с localhost. Некорректный список прерывает запуск |
ERROR_PAGES_DIR |
(не задано) | Каталог с пользовательскими страницами ошибок с именами {status}.html (например, 404.html, 503.html) |
MAX_QUERY_BODY |
524288 |
Максимальный размер тела запроса в байтах для внутренних query-эндпоинтов (512 KiB) |
TRACE_CONTEXT |
false |
Булево — см. Булевы значения. Если истинно, включает распространение W3C Trace Context: читает заголовки traceparent/tracestate и передаёт их в PHP через $_SERVER |
OpenTelemetry
| Переменная | По умолчанию | Описание |
|---|---|---|
OTEL_ENABLED |
false |
Включает экспорт спанов OpenTelemetry. Автоматически устанавливает TRACE_CONTEXT=true. Булево — см. Булевы значения |
OTEL_EXPORTER_OTLP_PROTOCOL |
grpc |
Протокол экспорта: grpc или http/protobuf |
OTEL_EXPORTER_OTLP_ENDPOINT |
http://localhost:4317 (gRPC) или http://localhost:4318 (HTTP) |
Эндпоинт OTLP-коллектора |
OTEL_EXPORTER_OTLP_TIMEOUT |
10000 |
Таймаут экспорта в миллисекундах |
OTEL_EXPORTER_OTLP_HEADERS |
(не задано) | Заголовки аутентификации: key=value,key2=value2 |
OTEL_SERVICE_NAME |
oxphp |
Имя сервиса в экспортируемых спанах |
OTEL_SERVICE_VERSION |
(не задано) | Атрибут версии сервиса |
OTEL_RESOURCE_ATTRIBUTES |
(не задано) | Дополнительные атрибуты ресурса: env=prod,region=us-east-1 |
OTEL_TRACES_SAMPLER |
parentbased_traceidratio |
Стратегия сэмплирования: always_on, always_off, traceidratio, parentbased_always_on, parentbased_always_off, parentbased_traceidratio |
OTEL_TRACES_SAMPLER_ARG |
1.0 |
Доля сэмплирования (0.0–1.0) для семплеров на основе отношения |
Недопустимые или выходящие за диапазон значения OTEL_TRACES_SAMPLER_ARG ограничиваются интервалом [0.0, 1.0] и логируются на уровне warn. Неизвестные значения OTEL_TRACES_SAMPLER откатываются к parentbased_traceidratio и логируются.
APM
| Переменная | По умолчанию | Описание |
|---|---|---|
OTEL_APM_ENABLED |
false |
Включает APM: автоматическую инструментацию, захват ошибок и PHP-SDK трассировки. Требует OTEL_ENABLED=true. Булево — см. Булевы значения |
OTEL_APM_SLOW_QUERY_MS |
100 |
Порог медленного запроса в миллисекундах. Запросы к базе данных, превышающие его, получают атрибут спана oxphp.db.slow=true |
OTEL_APM_DB_CAPTURE_PARAMS_ENABLED |
false |
Записывает связанные параметры в атрибут спана db.params. Отключите в продакшене, если параметры могут содержать чувствительные данные. Булево — см. Булевы значения |
OTEL_APM_STACKTRACE_MAX_BYTES |
8192 |
Максимальный размер атрибута exception.stacktrace в байтах. При превышении предела стектрейс обрезается с конца с маркером …(truncated). 0 отключает обрезку |
OTEL_APM_MESSAGE_MAX_BYTES |
4096 |
Максимальный размер атрибута exception.message в байтах (значение по умолчанию совпадает с ограничением New Relic на значение одного атрибута). При превышении предела сообщение обрезается с конца с маркером …(truncated). 0 отключает обрезку |
Когда APM включён, OxPHP автоматически перехватывает 33 внутренние функции PHP (PDO, mysqli, cURL, Redis, Memcached, файловый ввод-вывод), чтобы создавать дочерние спаны. PHP-функции oxphp_apm_*() регистрируются независимо от того, включён ли APM — когда он выключен, они являются безопасными no-op-заглушками.
Асинхронные воркеры
| Переменная | По умолчанию | Описание |
|---|---|---|
ASYNC_WORKERS |
0 (отключено) |
Число выделенных потоков асинхронных воркеров. При 0 асинхронные функции (oxphp_async и т. д.) регистрируются, но при вызове выбрасывают OxPHP\Async\AsyncException. Установите положительное значение, чтобы включить фоновое выполнение задач |
ASYNC_QUEUE_CAPACITY |
ASYNC_WORKERS × 64 |
Максимальное число ожидающих задач в асинхронной очереди. 0 = автоматически (воркеры × 64) |
ASYNC_MAX_FIBERS |
256 |
Ограничение на число одновременных файберов асинхронных задач на один воркер. Глобальный для процесса лимит выполняющихся (в очереди + запущенных) равен ASYNC_MAX_FIBERS × ASYNC_WORKERS; диспетчеризация сверх него немедленно отклоняется с OxPHP\Async\AsyncException, чтобы композиция с fan-out не могла привести к взаимоблокировке |
Пул асинхронных воркеров обрабатывает фоновые задачи типа «запустил и забыл», диспетчеризуемые из PHP. Он отделён от пула PHP-воркеров и не требуется для обработки обычных запросов.
Некорректное значение любой из этих трёх переменных (например, ASYNC_WORKERS=8x) приводит к ошибке при запуске — откат к значению по умолчанию молча отключил бы или неправильно настроил пул. Строго пустое значение трактуется как неустановленное.
Разделяемое состояние
Внутрипроцессные примитивы конкурентности (OxPHP\Shared\Counter, Map, Channel, Mutex, Once, Pool, Atomic, Flag, Registry). Обзор API см. в разделе Разделяемое состояние.
| Переменная | По умолчанию | Описание |
|---|---|---|
SHARED_ENABLED |
true |
Булево — см. Булевы значения. Главный переключатель всей подсистемы OxPHP\Shared\* |
SHARED_MAX_ENTRIES |
100000 |
Глобальное ограничение на суммарное число всех записей Shared. Вставка сверх него завершается с CapacityException |
SHARED_MAX_BYTES |
1073741824 (1 GiB) |
Глобальное ограничение на оценочный объём памяти по всем записям Shared |
SHARED_SOFT_LIMIT_RATIO |
0.7 |
Начинает сбрасывать наименее приоритетную работу, когда использование пересекает эту долю от SHARED_MAX_BYTES / SHARED_MAX_ENTRIES |
SHARED_METRICS_ENABLED |
true |
Булево. Включает/выключает экспозицию метрик oxphp_shared_* в Prometheus |
SHARED_INTROSPECTION_ENABLED |
true |
Булево. Включает/выключает API интроспекции /__ox_shared/* на внутреннем сервере |
SHARED_INTROSPECTION_PREVIEW_ENABLED |
true |
Булево. Включает/выключает предпросмотр значений в ответах интроспекции (отключите, когда предпросмотр может раскрыть чувствительные данные) |
SHARED_CYCLE_DETECT_DEPTH |
16 |
Глубина BFS при проверке на циклы. Увеличьте для глубоких допустимых графов |
SHARED_CYCLE_DETECT_EDGES |
10000 |
Число рёбер, обходимых при проверке на циклы. Увеличьте для плотных допустимых графов |
SHARED_MAX_VALUE_SIZE |
1048576 (1 MiB) |
Ограничение размера одного значения. Вставка большего значения завершается сразу с ошибкой |
SHARED_MAX_CHANNEL_BYTES |
67108864 (64 MiB) |
Ограничение суммарного объёма данных на один канал |
SHARED_POISON_STRICT |
false |
Булево. Если истинно, паника внутри замыкания Mutex/Once навсегда «отравляет» примитив вместо попытки восстановления по мере возможности |
SHARED_LOCK_DIAGNOSTICS |
off |
Диагностика конкуренции за блокировки: off, count или trace |
SHARED_LOCK_POLL_INTERVAL_MS |
100 |
Интервал опроса, используемый сэмплером диагностики блокировок |
SHARED_PREVIEW_STRING_LIMIT |
256 |
Обрезка каждой строки в предпросмотре /entry?id=… |
SHARED_PREVIEW_ARRAY_LIMIT |
20 |
Число записей, выбираемых в предпросмотре /entry?id=… |
Профилирование
Сэмплирующий профилировщик, который выдаёт трассы xhprof / speedscope. Форматы вывода и интеграцию с просмотрщиками см. в разделе Профилирование.
| Переменная | По умолчанию | Описание |
|---|---|---|
PROFILER_ENABLED |
false |
Булево — см. Булевы значения. Главный переключатель. Все остальные переменные PROFILER_* всё равно разбираются при запуске, поэтому опечатки всплывают сразу |
PROFILER_SAMPLE_RATE |
0.0 |
Вероятность (0.0–1.0) того, что запрос будет засэмплирован. Значения вне диапазона ограничиваются границами |
PROFILER_INTERNAL |
false |
Булево. Если истинно, запросы к внутреннему серверу (/health, /metrics, эндпоинты плагинов) также подпадают под сэмплирование |
PROFILER_AUTH_TOKEN |
(не задано) | Необязательный bearer-токен. Если задан, PHP-функции oxphp_profiler_* требуют, чтобы запросы несли этот токен для включения профилирования по требованию |
PROFILER_MAX_SPANS |
50000 |
Ограничение числа спанов профиля на один запрос. Профили, превышающие лимит, обрезаются |
PROFILER_MAX_DEPTH |
256 |
Максимальная глубина стека вызовов, захватываемая на один сэмпл. Жёстко ограничена значением 65535 |
PROFILER_OUTPUT_DIR |
/tmp/oxphp-profiles |
Каталог для файлов профилей на диске |
PROFILER_OUTPUT_FORMATS |
xhprof,speedscope |
Список форматов вывода через запятую для записи на диск |
PROFILER_DISK_MAX_PER_SEC |
10 |
Ограничение частоты записи файлов профилей на диск в секунду |
PROFILER_RETENTION_COUNT |
100 |
Максимальное число файлов профилей, хранимых в PROFILER_OUTPUT_DIR. Более старые файлы удаляются |
PROFILER_EXPORT_URL |
(не задано) | Удалённый эндпоинт, на который отправляются профили методом POST. Если задан, запись на диск всё равно происходит, если только PROFILER_OUTPUT_FORMATS не пуст |
PROFILER_EXPORT_FORMAT |
xhprof |
Формат передачи для отправок на PROFILER_EXPORT_URL |
PROFILER_EXPORT_AUTH_TOKEN |
(не задано) | Необязательный bearer-токен, отправляемый с каждым запросом экспорта |
PROFILER_EXPORT_XHGUI |
(автоопределение) | Булево. Принудительно включает XHGui-совместимую обёртку для экспортируемого тела. Не задано = автоопределение, когда путь PROFILER_EXPORT_URL оканчивается на /run/import (подсказки в хосте/строке запроса не учитываются) |
PROFILER_EXPORT_BUGGREGATOR |
(автоопределение) | Булево. Принудительно включает конверт Buggregator. Не задано = автоопределение, когда путь PROFILER_EXPORT_URL оканчивается на /api/profiler/store. Конверт всегда выдаёт xhprof, поэтому PROFILER_EXPORT_FORMAT для него игнорируется (не-xhprof значение вызывает предупреждение, не фатально). Взаимоисключающ с PROFILER_EXPORT_XHGUI — включение обоих приводит к ошибке при запуске |
PROFILER_EXPORT_APP_NAME |
(не задано) | Buggregator app_name для группировки по проектам |
PROFILER_EXPORT_TAGS |
(не задано) | Buggregator tags в виде key=value,key2=value2; некорректный токен, пустой ключ или дублирующийся ключ приводит к ошибке при запуске |
Примеры конфигураций
Разработка
LISTEN_ADDR=127.0.0.1:8080
DOCUMENT_ROOT=./public
LOG_LEVEL=debug
ACCESS_LOG=all
PHP_WORKERS=1
INTERNAL_ADDR=127.0.0.1:9090Продакшен (Framework)
LISTEN_ADDR=0.0.0.0:80
DOCUMENT_ROOT=/var/www/html/public
ENTRY_FILE=index.php
PHP_WORKERS=8
QUEUE_CAPACITY=1024
LOG_LEVEL=warn
ACCESS_LOG=error
MAX_CONNECTIONS=10000
INTERNAL_ADDR=127.0.0.1:9090
RATE_LIMIT=100
RATE_WINDOW_SECONDS=60
TRUSTED_PROXIES=private
HEADER_TIMEOUT_SECONDS=5
DRAIN_TIMEOUT_SECONDS=25
COMPRESSION_LEVEL=4
STATIC_MAX_AGE=30dПродакшен (режим воркеров)
LISTEN_ADDR=0.0.0.0:80
DOCUMENT_ROOT=/var/www/html/public
WORKER_MODE_ENABLED=true
ENTRY_FILE=../worker.php
PHP_WORKERS=8
WORKER_MAX_MEMORY_MIB=128
QUEUE_CAPACITY=1024
LOG_LEVEL=warn
ACCESS_LOG=error
INTERNAL_ADDR=127.0.0.1:9090TLS
LISTEN_ADDR=0.0.0.0:443
TLS_CERT=/etc/ssl/oxphp/cert.pem
TLS_KEY=/etc/ssl/oxphp/key.pem
DOCUMENT_ROOT=/var/www/html/public
ENTRY_FILE=index.phpПроверка активной конфигурации
Когда внутренний сервер запущен, обратитесь к эндпоинту /config, чтобы увидеть итоговую конфигурацию:
curl -s http://localhost:9090/config | jq .{
"listen_addr": "0.0.0.0:80",
"document_root": "/var/www/html/public",
"entry_file": "/var/www/html/public/index.php",
"log_level": "warn",
"executor_type": "sapi",
"php_workers": "8",
"tokio_workers": 4,
"queue_capacity": 1024,
"max_connections": 10000,
"drain_timeout_seconds": 30,
"header_timeout_seconds": 5,
"rate_limit": 100,
"rate_window_seconds": 60,
"tls_enabled": true,
"compression_level": 4,
"access_log": "all",
"max_query_body": 524288,
"worker_mode_enabled": false,
"worker_max_memory_mib": 0,
"static_max_age": 2592000,
"static_revalidate": false,
"async_workers": 0,
"async_queue_capacity": 0,
"async_max_fibers": 256,
"async_in_flight_cap": 0,
"trace_context": true,
"superglobals_enabled": true,
"trusted_proxies": false,
"plugins": {
"otel": {
"enabled": true,
"protocol": "grpc",
"service_name": "oxphp"
},
"apm": {
"enabled": true,
"slow_query_ms": 100,
"db_capture_params": false,
"hooks_registered": 33
}
}
}Отдаваемый ответ /config вычищает несколько ключей, которые несёт внутреннее представление Config: пути к TLS-сертификату и ключу никогда не выводятся (tls_enabled показывает, активен ли TLS), а internal_addr и error_pages_dir удаляются — это топология развёртывания и пути в файловой системе, которые помогают злоумышленнику и не нужны сборщикам метрик.
См. также
- Маршрутизация — режимы маршрутизации и поведение
ENTRY_FILE - Проверки работоспособности — эндпоинты внутреннего сервера
- Метрики — справочник Prometheus-совместимых метрик
- Корректное завершение работы — как
DRAIN_TIMEOUT_SECONDSвлияет на завершение - TLS — настройка TLS и требования к сертификатам
- Ограничение частоты запросов — детали ограничения частоты запросов по IP
- Режим воркеров — архитектура постоянных PHP-воркеров
- Сжатие — детали сжатия Brotli
- Статические файлы — кэширование и отдача файлов
- Распределённая трассировка и APM — экспорт OTel, автоматическая инструментация и PHP-SDK трассировки