Быстрый старт

Официальный образ OxPHP включает сервер, PHP, расширение OxPHP и все зависимости среды выполнения, поэтому вы можете пройти путь от пустого каталога до работающего приложения за несколько команд.

Одна команда

Если у вас уже есть PHP-проект с каталогом public/:

bash
docker run -p 80:80 -v .:/var/www/html ghcr.io/oxphp/oxphp:0.10.0

Откройте http://localhost/. Ваше приложение работает.

Чтобы включить внутренний сервер (работоспособность, метрики, конфигурация):

bash
docker run -p 80:80 -p 9090:9090 -e INTERNAL_ADDR=0.0.0.0:9090 -v .:/var/www/html ghcr.io/oxphp/oxphp:0.10.0

Пошаговая настройка с Docker Compose

Более подробное руководство — от пустого каталога до работающего PHP-приложения с проверками работоспособности и структурированным логированием.

  1. Создайте каталог проекта.

    bash
    mkdir my-oxphp-app && cd my-oxphp-app
  2. Создайте Dockerfile.

    Dockerfile
    FROM ghcr.io/oxphp/oxphp:0.10.0 COPY --chown=www-data:www-data . /var/www/html

    Официальный образ включает бинарный файл сервера, PHP 8.4 или 8.5 ZTS (8.5 по умолчанию; PHP 8.4 доступен по тегу :0.10.0-php8.4 или по любому тегу *-php8.4*), расширение OxPHP для PHP и все зависимости среды выполнения.

  3. Добавьте compose.yaml.

    compose.yaml
    services: oxphp: build: . ports: - "80:80" - "9090:9090" environment: - LISTEN_ADDR=0.0.0.0:80 - DOCUMENT_ROOT=/var/www/html/public - INTERNAL_ADDR=0.0.0.0:9090 - LOG_LEVEL=info - ACCESS_LOG=all

    Порт 80 обслуживает ваше приложение. Порт 9090 открывает внутренний сервер для проверок работоспособности, метрик Prometheus и снимка активной конфигурации.

  4. Создайте PHP-приложение.

    bash
    mkdir -p public

    Создайте public/index.php:

    public/index.php
    <?php $requestId = oxphp_request_id(); $info = oxphp_server_info(); echo "<h1>OxPHP</h1>\n"; echo "<p>Request ID: {$requestId}</p>\n"; echo "<p>Worker: {$info['worker_id']}</p>\n"; echo "<p>SAPI: " . php_sapi_name() . "</p>\n"; echo "<p>Version: {$info['version']}</p>\n"; echo "<p>Time: " . date('c') . "</p>\n";

    oxphp_request_id() возвращает уникальный идентификатор, присваиваемый каждому запросу. oxphp_server_info() возвращает сведения о работающем сервере, включая version, worker_id, request_time и worker_mode.

  5. Соберите и запустите.

    bash
    docker compose up -d --build
  6. Протестируйте приложение.

    bash
    curl http://localhost/

    Ожидаемый вывод:

    html
    <h1>OxPHP</h1> <p>Request ID: 67a4b3c11a2b00000001</p> <p>Worker: 0</p> <p>SAPI: cli-server</p> <p>Version: 0.10.0</p> <p>Time: 2026-03-23T12:00:00+00:00</p>

    Каждый запрос получает уникальный идентификатор. Идентификатор воркера показывает, какой поток PHP-воркера его обработал.

  7. Проверьте внутренние эндпоинты.

    bash
    # Проверка работоспособности — 200 при исправном состоянии, 503 при деградации curl http://localhost:9090/health # Метрики, совместимые с Prometheus curl http://localhost:9090/metrics # Активная конфигурация (пути к TLS скрыты) curl http://localhost:9090/config
  8. Просмотрите логи.

    bash
    docker compose logs -f oxphp

    Поскольку задано ACCESS_LOG=all, каждый запрос отображается как структурированная строка лога в формате JSON с указанием метода, пути, статуса, времени ответа и идентификатора запроса.

Tip

Если вашему приложению нужны дополнительные расширения PHP (pdo_pgsql, intl, xdebug и т. д.), см. examples/dockerfile/Dockerfile в репозитории. Это готовый к использованию многоэтапный Dockerfile с отдельными целями dev и prod.

Почему `php_sapi_name()` возвращает `cli-server` вместо `oxphp`?

OxPHP намеренно регистрируется под одним из имён SAPI, распознаваемых OPcache. OPcache отключается для неизвестных SAPI; без этого переименования выполнение PHP полностью обошло бы слой OPcache и работало бы в несколько раз медленнее. Компромисс в том, что php_sapi_name() нельзя использовать для определения OxPHP — используйте вместо этого function_exists('oxphp_request_id') или OxPHP\Http\Request::current().

Что дальше

  • Руководство по Docker — Dockerfile для разработки и продакшена, настройка Compose, монтирование PHP ini и настройка проверок работоспособности
  • Конфигурация — полный справочник по переменным окружения
  • Маршрутизация — режимы маршрутизации Traditional, Framework, SPA и Worker
  • Режим воркеров — постоянные PHP-процессы, которые инициализируются один раз и обрабатывают несколько запросов
  • Функции PHP — все встроенные PHP-функции OxPHP