Szybki start

Oficjalny obraz OxPHP zawiera serwer, PHP, rozszerzenie OxPHP oraz wszystkie zależności środowiska uruchomieniowego, dzięki czemu od pustego katalogu do działającej aplikacji dzieli Cię zaledwie kilka poleceń.

Jedno polecenie

Jeśli masz już projekt PHP z katalogiem public/:

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

Otwórz http://localhost/. Twoja aplikacja działa.

Aby włączyć serwer wewnętrzny (stan, metryki, konfiguracja):

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

Konfiguracja krok po kroku z Docker Compose

Bardziej szczegółowy przewodnik — od pustego katalogu do działającej aplikacji PHP z kontrolami stanu i strukturalnym logowaniem.

  1. Utwórz katalog projektu.

    bash
    mkdir my-oxphp-app && cd my-oxphp-app
  2. Utwórz plik Dockerfile.

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

    Oficjalny obraz zawiera binarny plik serwera, PHP 8.4 lub 8.5 ZTS (domyślnie 8.5; wersję 8.4 pobierzesz za pomocą tagu :0.10.0-php8.4 lub dowolnego tagu *-php8.4*), rozszerzenie PHP OxPHP oraz wszystkie zależności środowiska uruchomieniowego.

  3. Dodaj plik 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

    Port 80 obsługuje Twoją aplikację. Port 9090 udostępnia serwer wewnętrzny na potrzeby kontroli stanu, metryk Prometheusa oraz migawki aktywnej konfiguracji.

  4. Utwórz aplikację PHP.

    bash
    mkdir -p public

    Utwórz plik 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() zwraca unikatowy identyfikator przypisany do każdego żądania. oxphp_server_info() zwraca szczegóły dotyczące działającego serwera, w tym version, worker_id, request_time oraz worker_mode.

  5. Zbuduj i uruchom.

    bash
    docker compose up -d --build
  6. Przetestuj aplikację.

    bash
    curl http://localhost/

    Oczekiwany wynik:

    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>

    Każde żądanie otrzymuje unikatowy identyfikator. ID workera wskazuje, który wątek workera PHP je obsłużył.

  7. Sprawdź endpointy wewnętrzne.

    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. Wyświetl logi.

    bash
    docker compose logs -f oxphp

    Ponieważ ustawiono ACCESS_LOG=all, każde żądanie pojawia się jako strukturalna linia logu w formacie JSON zawierająca metodę, ścieżkę, status, czas odpowiedzi oraz ID żądania.

Tip

Jeśli Twoja aplikacja wymaga niestandardowych rozszerzeń PHP (pdo_pgsql, intl, xdebug itp.), zobacz examples/dockerfile/Dockerfile w repozytorium. To gotowy do użycia wieloetapowy plik Dockerfile z osobnymi celami dev i prod.

Dlaczego `php_sapi_name()` zwraca `cli-server` zamiast `oxphp`?

OxPHP celowo rejestruje się pod jedną z nazw SAPI rozpoznawanych przez OPcache. OPcache wyłącza się dla nieznanych SAPI; bez tej zmiany nazwy wykonywanie PHP całkowicie pomijałoby warstwę OPcache i działałoby kilkukrotnie wolniej. Kompromis polega na tym, że php_sapi_name() nie może służyć do wykrywania OxPHP — zamiast tego użyj function_exists('oxphp_request_id') lub OxPHP\Http\Request::current().

Co dalej

  • Przewodnik po Dockerze — deweloperskie i produkcyjne pliki Dockerfile, konfiguracja Compose, montowanie plików ini PHP oraz konfiguracja kontroli stanu
  • Konfiguracja — pełna dokumentacja zmiennych środowiskowych
  • Routing — tryby routingu Traditional, Framework, SPA i Worker
  • Tryb worker — trwałe procesy PHP, które inicjalizują się raz i obsługują wiele żądań
  • Funkcje PHP — wszystkie wbudowane funkcje PHP w OxPHP