高性能サーバー

BEAR.Sundayアプリケーションは、リクエストごとのブートストラップオーバーヘッドを排除する高性能PHPサーバー上で実行できます。このガイドでは、Swoole、RoadRunner、FrankenPHPの3つのサーバーオプションについて説明します。

概要

従来のPHP-FPMでは、各リクエストごとにアプリケーション全体をブートストラップします:

Request -> Boot Framework -> Route -> Execute -> Response -> Shutdown
Request -> Boot Framework -> Route -> Execute -> Response -> Shutdown
Request -> Boot Framework -> Route -> Execute -> Response -> Shutdown

永続的なワーカーモードでは、アプリケーションは一度だけブートします:

Boot Framework (once)
    |
Request -> Route -> Execute -> Response
Request -> Route -> Execute -> Response
Request -> Route -> Execute -> Response

これによりブートオーバーヘッドが排除され、レイテンシが大幅に低下し、スループットが向上します。

BEAR.Sundayのステートレスなリソース設計とイミュータブルなアーキテクチャは、永続ワーカー環境と相性が良く、グローバル状態の問題なくワーカーモードに移行できます。

サーバー比較

機能 Swoole RoadRunner FrankenPHP
言語 C + PHP Go + PHP Go + PHP
ワーカーモード あり あり あり
HTTP/2 あり あり あり
HTTP/3 なし なし あり
WebSocket ネイティブ ネイティブ Caddy経由
コルーチン あり なし なし
ホットリロード 手動 あり あり
メモリ制限 共有 ワーカー単位 ワーカー単位

Dockerクイックスタート

bear-sunday-serversリポジトリは、3つのサーバーすべてのDocker設定を提供しています。

git clone https://github.com/bearsunday/bear-sunday-servers.git
cd bear-sunday-servers

# Swoole (port 8081)
cd swoole && docker compose up -d && curl http://localhost:8081/

# RoadRunner (port 8082)
cd roadrunner && docker compose up -d && curl http://localhost:8082/

# FrankenPHP (port 8080)
cd frankenphp && docker compose up -d && curl http://localhost:8080/

Swoole

Swooleは、イベント駆動の非同期I/Oを提供するコルーチンベースのPHP拡張です。

特徴

  • イベント駆動: 非同期I/O処理
  • コルーチン: スレッドなしの並行リクエスト処理
  • リクエスト分離: コルーチンコンテキストによるリクエスト分離
  • 高性能: リクエストごとのブートオーバーヘッドを排除
  • メモリ効率: ワーカー間でメモリを共有

インストール

Swoole拡張(ext-swoole ^6.1)

pecl install swoole

またはソースからコンパイル:

git clone https://github.com/swoole/swoole-src.git && \
cd swoole-src && \
phpize && \
./configure && \
make && make install

php.iniextension=swoole.soを追加してください。

BEAR.Swooleパッケージ

composer require bear/swoole

ブートストラップスクリプト

bin/swoole.phpを作成:

<?php

declare(strict_types=1);

require dirname(__DIR__) . '/autoload.php';

$bootstrap = dirname(__DIR__) . '/vendor/bear/swoole/bootstrap.php';

$context = getenv('BEAR_CONTEXT') ?: 'prod-hal-app';
$ip = getenv('SWOOLE_IP') ?: '0.0.0.0';
$port = (int) (getenv('SWOOLE_PORT') ?: 8080);

exit((require $bootstrap)(
    $context,
    'MyVendor\MyProject',
    $ip,
    $port
));

実行

php bin/swoole.php
Swoole http server is started at http://127.0.0.1:8080

環境変数

変数 デフォルト 説明
BEAR_CONTEXT prod-hal-app BEAR.Sundayコンテキスト
SWOOLE_IP 0.0.0.0 サーバーバインドアドレス
SWOOLE_PORT 8080 サーバーポート

開発時の注意

XdebugはSwooleのコルーチンと完全に互換性がありません。デバッグには:

  • var_dump() / error_log()を使用
  • またはSwooleを無効にしてPHPのビルトインサーバー + Xdebugを使用

Swooleは自動ホットリロードをサポートしていません。コード変更後は再起動が必要です:

# Dockerの場合
docker compose restart

# Dockerなしの場合
pkill -f swoole.php && php bin/swoole.php

並列実行

Swooleサーバーには2つの独立した関心事があります:

  • サーバー: アプリケーションをどう実行するか(このページ)
  • 並列実行: 埋め込みリソースをどう並行処理するか

BEAR.Asyncを使用すると、#[Embed]リソースがSwooleコルーチンで自動的に並列実行されます。詳細は並列リソース実行を参照してください。


RoadRunner

RoadRunnerは、PSR-7 PHPワーカーを持つ高性能Goアプリケーションサーバーです。

特徴

  • Goアプリケーションサーバー: 高性能プロセスマネージャー
  • PSR-7ワーカー: 標準HTTPメッセージインターフェース
  • ビルトインメトリクス: Prometheus互換エンドポイント
  • ホットリロード: ファイル変更時の自動ワーカー再起動

インストール

RoadRunnerバイナリ

リリースページからダウンロード、またはDockerを使用。

PHP依存関係

composer require spiral/roadrunner-http nyholm/psr7

設定

.rr.yamlを作成(bin/worker.phpの実装例を参照):

version: "3"

server:
  command: "php bin/worker.php"
  relay: pipes

http:
  address: "0.0.0.0:8082"
  pool:
    num_workers: 4
    max_jobs: 1000
    allocate_timeout: 60s
    destroy_timeout: 60s

logs:
  mode: production
  level: info
  output: stdout

status:
  address: "0.0.0.0:2112"

実行

./rr serve -c .rr.yaml

環境変数

変数 デフォルト 説明
BEAR_CONTEXT prod-hal-app BEAR.Sundayコンテキスト
MAX_REQUESTS 1000 ワーカー再起動までのリクエスト数

メトリクス

Prometheusメトリクスはhttp://localhost:2112/metricsで利用可能です。


FrankenPHP

FrankenPHPは、ワーカーモードをサポートするCaddyベースのモダンPHPアプリケーションサーバーです。

特徴

  • ワーカーモード: リクエストごとのアプリケーションブートコストを排除
  • HTTP/2 & HTTP/3: Caddyによる自動HTTPS
  • 本番環境対応: OPcache JIT、マルチステージビルド
  • 開発環境対応: Xdebug、ホットリロード

インストール

FrankenPHPは通常Dockerで使用します。スタンドアロンインストールについては、FrankenPHPドキュメントを参照してください。

Dockerで実行

docker run -v $PWD:/app -p 8080:8080 dunglas/frankenphp

環境変数

変数 デフォルト 説明
BEAR_CONTEXT prod-hal-app BEAR.Sundayコンテキスト
MAX_REQUESTS 1000 ワーカー再起動までのリクエスト数
SERVER_NAME :8080 リッスンアドレス
FRANKENPHP_NUM_WORKERS 4 ワーカープロセス数

メモリ管理

  • ワーカーはMAX_REQUESTS後に自動的に再起動してメモリリークを防止
  • 各リクエスト後にgc_collect_cycles()を実行
  • 無制限リクエストにはMAX_REQUESTS=0を設定(開発時のみ)

本番デプロイ

本番デプロイには、bear-sunday-serversの各サーバーディレクトリに以下が含まれています:

  • Dockerfile - 最適化された本番ビルド
  • docker-compose.prod.yml - 本番設定
  • ヘルスチェックエンドポイント
  • OPcache最適化

本番デプロイの例:

cd swoole  # または roadrunner, frankenphp
docker compose -f docker-compose.prod.yml up -d

関連

参考リンク