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/:
docker run -p 80:80 -v .:/var/www/html ghcr.io/oxphp/oxphp:0.10.0Otwórz http://localhost/. Twoja aplikacja działa.
Aby włączyć serwer wewnętrzny (stan, metryki, konfiguracja):
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.0Konfiguracja 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.
-
Utwórz katalog projektu.
mkdir my-oxphp-app && cd my-oxphp-app -
Utwórz plik Dockerfile.
FROM ghcr.io/oxphp/oxphp:0.10.0 COPY --chown=www-data:www-data . /var/www/htmlOficjalny 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.4lub dowolnego tagu*-php8.4*), rozszerzenie PHP OxPHP oraz wszystkie zależności środowiska uruchomieniowego. -
Dodaj plik 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=allPort
80obsługuje Twoją aplikację. Port9090udostępnia serwer wewnętrzny na potrzeby kontroli stanu, metryk Prometheusa oraz migawki aktywnej konfiguracji. -
Utwórz aplikację PHP.
mkdir -p publicUtwórz plik
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 tymversion,worker_id,request_timeorazworker_mode. -
Zbuduj i uruchom.
docker compose up -d --build -
Przetestuj aplikację.
curl http://localhost/Oczekiwany wynik:
<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ł.
-
Sprawdź endpointy wewnętrzne.
# 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 -
Wyświetl logi.
docker compose logs -f oxphpPonieważ 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.
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.
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