クイックスタート

公式の OxPHP イメージには、サーバー、PHP、OxPHP 拡張、そしてすべてのランタイム依存関係がバンドルされています。 そのため、わずか数コマンドで空のディレクトリからアプリを起動できます。

ワンコマンド

すでに public/ ディレクトリを持つ PHP プロジェクトがある場合は、次のようにします。

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、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() は、各リクエストに割り当てられる一意の ID を返します。oxphp_server_info() は、 versionworker_idrequest_timeworker_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>

    各リクエストには一意の ID が付与されます。ワーカー ID は、どの 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 が設定されているため、すべてのリクエストが、メソッド、パス、ステータス、レスポンスタイム、 リクエスト ID を含む構造化 JSON ログ行として出力されます。

Tip

アプリケーションにカスタム PHP 拡張(pdo_pgsql、intl、xdebug など)が必要な場合は、リポジトリ内の examples/dockerfile/Dockerfile を参照してください。これは、devprod のターゲットを分離した、すぐに使えるマルチステージ Dockerfile です。

`php_sapi_name()` が `oxphp` ではなく `cli-server` を報告するのはなぜですか?

OxPHP は意図的に、OPcache が認識する SAPI 名のいずれかで登録します。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 関数 — OxPHP のすべての組み込み PHP 関数