1. fyui_001

    No comment

    fyui_001
Changes in body
Source | HTML | Preview

アプリケーションサーバーの新潮流

昨今のPHP界隈では、Swooleに代表されるように、よくあるApache+mod_phpやPHP-FPMによる従来の構成と異なる実行方法を持つPHPのためのHTTPサーバまたはアプリケーションサーバが少しずつ注目を集めるようになっています。

RoadRunner

RoadRunnerもそんな新興のアプリケーションサーバの1つで、Go言語で書かれています。 HTTPのリクエストを前段のGoのHTTPハンドラがさばき、ロードバランサ/プロセスマネージャがPHPのWorkerにリクエストを割り振るという構成になっています。

通常のHTTPサーバだけでなく、RoadRunnerによるgRPCサーバの実装も公開されており、PHPの新しい可能性を見せてくれています。

RoadRunnerを試す

RoadRunnerはLaravelもサーポートしており、Laravel用のパッケージも開発されているので

今回はこれをベースにRoadRunner実装していきたいと思います。

RoadRunnerのインストール

まずは下記コマンドでパッケージのインストールを行います。

# roadrunner
composer require spiral/roadrunner "^1.8"
# roadrunner-laravel
composer require spiral/roadrunner-laravel "^3.4"

次に、下記コマンドを実行してパッケージ構成ファイル(./config/roadrunner.php)を作ります。

php artisan vendor:publish --provider='Spiral\RoadRunnerLaravel\ServiceProvider' --tag=config

.rr.ymlの作成

roadrunnerの設定ymlファイルを書きます。

80番ポートで起動するように設定します。

env:
  APP_REFRESH: true
http:
  address: 0.0.0.0:80
  http2:
    enabled: true
    h2c: true
    maxConcurrentStreams: 128
  workers:
    command: 'php ./vendor/bin/rr-worker'
static:
  dir: public
reload:
  interval: 1s
  patterns: [ '.php' ]
  services:
    http:
      dirs: [ '' ]
      recursive: true

諸々の微修正

logging.php

'stdout' => [
    'driver' => 'monolog',
    'handler' => StreamHandler::class,
    'with' => [
        //php://stdoutにするとエラーになってコケるのでphp://stderrに変える
        'stream' => 'php://stderr',
     ],
     'level' => 'debug',
],

composer.jsonにscriptを追加する。

"scripts": {
        "roadrunner:dev": [
            "composer dump-autoload",
            "./rr serve -v -d"
        ],
        "roadrunner:prod": [
            "./rr serve"
        ],
        "roadrunner:setup": [
            "rr get-binary"
        ],
    }

startup.shに起動コマンドを乗せる

# roadrunner
composer roadrunner:setup
chmod +x rr
composer roadrunner:dev

これで大体の設定は完了しました。

起動してみる

以下の手順で起動させます。

cp docker-compose.example.yml docker-compose.yml

docker-compose up -d

無事に起動できました。

スクリーンショット 2020-11-27 12.59.30.png (168.6 kB)

まとめ

今回はGolangで作られたPHPのweb・アプリケーションサーバーを使った。サンプルを作ってみました。
おもしろいですが、不安定なのでプロダクション環境ではあまり使うのはおすすめできないですね。

参考文献

https://nextat.co.jp/staff/archives/235