Швидкий старт

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

Одна команда

Якщо у вас уже є PHP-проєкт із каталогом public/:

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

Відкрийте http://localhost/. Ваш застосунок працює.

Щоб увімкнути внутрішній сервер (health, метрики, конфігурація):

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.13.0

Покрокове налаштування з Docker Compose

Докладніший розбір: від порожнього каталогу до робочого PHP-застосунку з перевірками стану та структурованим журналюванням.

  1. Створіть каталог проєкту.

    bash
    mkdir my-oxphp-app && cd my-oxphp-app
  2. Створіть Dockerfile.

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

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

  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 і runtime_hooks.

  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.13.0</p> <p>Time: 2026-03-23T12:00:00+00:00</p>

    Кожен запит отримує унікальний ідентифікатор. Ідентифікатор воркера показує, який потік PHP-воркера його обробив.

  7. Перевірте внутрішні ендпоінти.

    bash
    # Health check — 200 when healthy, 503 when degraded curl http://localhost:9090/health # Prometheus-compatible metrics curl http://localhost:9090/metrics # Active configuration (TLS paths redacted) 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. Для невідомих SAPI OPcache вимикається; без цього перейменування виконання PHP повністю оминало б шар OPcache і працювало б у кілька разів повільніше. Зворотний бік — php_sapi_name() не можна використати для виявлення OxPHP; натомість використовуйте function_exists('oxphp_request_id') або OxPHP\Http\Request::current().

Промпти для вашого агента

Ці промпти розраховані на агента з підключеним MCP-сервером документації OxPHP — потрібні сторінки він прочитає сам.

prompt
Запусти мій PHP-застосунок на OxPHP. Прочитай сторінку `getting-started/quick-start` через MCP-сервер документації OxPHP. З’ясуй за цим репозиторієм, який режим маршрутизації йому потрібен і який у нього кореневий каталог документів, а тоді дай мені найменшу конфігурацію, що його обслуговує.

Що далі

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