Share
Embed
Transcript
63 slides
-
for PHPカンファレンス沖縄2021 RoadRunnerの世界 ~ Yet Another Alt PHP-FPM 2021年5月29日 (土)
株式会社Nextat 中榮健二 Nextat Inc. 1 -
自己紹介 from 京都 - 中榮健二 (なかえけんじ) - twitter: @n_1215 -
株式会社Nextat 取締役 - Laravel中心にECサイトやシステム開発 - 最近はFaaS+TSを使ったりUnityを使ったりPHP以外の仕事も増加 Nextat Inc. 2 -
発表概要 1. Alt PHP-FPMとは 2. RoadRunnerとは 3. RoadRunnerの設計思想 4. Get
Started with RoadRunner 5. フレームワーク インテグレーション 6. 利用上のハマりどころ 7. まとめ Nextat Inc. 3 -
1-1. 従来のPHP製Webアプリケーションの実行方式 PHP-FPM (FastCGI Process Manager) NginxなどのWebサーバと併用 Apache HTTP
Server mod_php、mod_cgi etc. PHP-FPMとの併用も可 Nextat Inc. 5 -
1-2. 従来のPHPのトレードオフ メリット メモリリークを気にしなくて良い HTTPリクエストをまたぐ状態を気にしなくて良い デメリット 毎回初期化するオーバーヘッド とはいえ大抵の場合に充分なパフォーマンスは出せる OPCache、Preloading、JIT HTTPサーバを別途用意する必要がある
PHPだけでHTTP Serverにはなれない WebSocket Server、gRPC Serverなど長時間実行が必要な用途に向かない Nextat Inc. 7 -
1-3. Alt PHP-FPM 従来のPHPとは異なる実行方式を持つ新興のHTTP・アプリケーションサーバを 本資料では Alt PHP-FPM と呼称 Swoole ReactPHP
Amp PHP-PM (PHP Process Manager) ※ ApacheやLighttpdやIISのことも忘れてませんが、一旦置いておいてください Nextat Inc. 8 -
HTTPサーバの例 (React) https://reactphp.org/ $loop = React\EventLoop\Factory::create(); $server = new React\Http\Server(
$loop, function (Psr\Http\Message\ServerRequestInterface $request) { return new React\Http\Message\Response( 200, ['Content-Type' => 'text/plain'], "Hello World!\n" ); } ); $socket = new React\Socket\Server(8080, $loop); $server->listen($socket); $loop->run(); Nextat Inc. 13 -
Software Gunslinger - PHP is meant to die 著者はPHP4の頃から10年以上の経験を持つPHP開発者 PHPという言語が滅ぶべくして滅ぶ、という話ではない
PHPは実行がすぐ終わる(= die)ことを前提に設計されている 合わない使い方はするなよ、という話 WebSocketやキューワーカーのためにバックグラウンドでのコード実行したい だが、PHPをデーモン化する(Summon the daemons)とメモリリークな ど問題発生 Python + Flask + Supervisor + Gunicornの構成に感銘を受けたらしい Nextat Inc. 23 -
Software Gunslinger - PHP is meant to die, continued 前記事の補足記事
(現時点では)継続的に実行させるプロセスにPHPは向いていない、という主旨 ReactPHPの検証 メモリーリークの問題、安定性の問題 ReactをWorkerで実行する方法なら望みはあるかも、という事も書いてある Nextat Inc. 24 -
RoadRunnerの開発者 https://github.com/wolfy-j Anton Titov 氏 (a.k.a Wolfy-J) Spiral Scout CTO・共同創業者。Twitter
@lachezis 日本語Tweetにも「それRoadRunnerで出来るよ」とリプをくれるナイスガイ RoadRunnerに関するツイートは全て補足されている模様 本資料の大半は氏の発表資料、動画を参考にしています Nextat Inc. 26 -
既存のAlt PHP-FPMの比較と考察 RoadRunner (スライド・ロシア語) https://docs.google.com/presentation/d/1YnymGamkustDeujhTJhyTN h9_UtayV7quzF-4H3W0tU PHPKonf 2020 - Anton
Titov: Designing hybrid Go/PHP applications using RoadRunner(動画・英語) https://www.youtube.com/watch?v=mj6d-IGzSYE Nextat Inc. 28 -
PHPとのGoのプロセス間通信の選択肢 既存のもの 素晴らしいライブラリ deuill/go-php がすでにあったが合わなかった PHPのカスタムビルドが必要。設定が難しい 共有メモリ OS依存 ポテンシャルは高いが扱いが難しい ソケット/パイプを介したバイナリストリームによる通信
古典的で実績のあるアプローチ こちらを採用 Nextat Inc. 38 -
Goridgeの実装に利用されたパッケージ Golang バイナリの扱い: encoding/binary 標準入出力: io UNIX, TCP: net PHP
バイナリの扱い: pack(), unpack() 標準入出力: 組込みのストリーム Unix, TCP: 組込みのソケット Nextat Inc. 40 -
ブログ記事: PHP was never meant to die https://spiralscout.com/blog/php-was-never-meant-to-die PHP is
meant to die に 対するアンサーを意識した題名 従来のPHPの課題と非効率性 既存のAlt PHP-FPMの選択肢への不満 RoadRunnerの設計の概要 負荷がスパイクする環境のNginx、PHP-FPMをRoadRunnerに置換 502エラーを解消し、サーバを3分の2に減らせた Nextat Inc. 42 -
インストール $ composer require spiral/roadrunner:v2.0 nyholm/psr7 $ ./vendor/bin/rr get-binary $
chmod 744 rr 現在の最新版は 2.2.1 requires PHP >= 7.4 PSR-7の実装パッケージが必要(ここでは nyholm/psr7) 1系ではLaminas(Zend) Diactorosに依存していたが取り除かれた Composerでインストールし、コマンドを使ってバイナリをDL ※ DL時にサンプルの設定ファイルを生成するかどうか尋ねられるがNoで良い Nextat Inc. 44 -
設定ファイル .rr.yaml rpc: listen: tcp://127.0.0.1:6001 server: command: "php worker.php" http: address:
"0.0.0.0:8080" pool: num_workers: 4 https://roadrunner.dev/docs/intro-config の 最小構成を参照 Nextat Inc. 45 -
PHP Worker のエントリポイント worker.php <?php use Spiral\RoadRunner; use Nyholm\Psr7; include
"vendor/autoload.php"; $worker = RoadRunner\Worker::create(); $psrFactory = new Psr7\Factory\Psr17Factory(); $worker = new RoadRunner\Http\PSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory); while ($req = $worker->waitRequest()) { try { $rsp = new Psr7\Response(); $rsp->getBody()->write('Hello world!'); $worker->respond($rsp); } catch (\Throwable $e) { $worker->getWorker()->error((string)$e); } } Nextat Inc. 46 -
おまけ: Docker環境 Spiral ScoutのRoadRunnerのDockerイメージ https://hub.docker.com/r/spiralscout/roadrunner ローカル開発用のDocker環境スケルトン (手前味噌ですが) https://github.com/n1215/roadrunner-docker-skeleton Docker ComposeとBashが必要
$ git clone https://github.com/n1215/roadrunner-docker-skeleton.git your_app $ cd your_app $ ./task init $ ./task up Nextat Inc. 48 -
多くのFWに対応 (サードパーティ多め) CakePHP https://github.com/CakeDC/cakephp-roadrunner Laminas Mezzio https://github.com/bcremer/roadrunner-mezzio- integration Laravel https://github.com/spiral/roadrunner-laravel
Slim https://github.com/tanakahisateru/rr-slim Symfony https://github.com/baldinof/roadrunner-bundle Symlex https://github.com/symlex/symlex Yii https://forum.yiiframework.com/t/using-roadrunner-as-a- server/127060 PSR-7を使っているものだと接続が簡単 Symfony HTTP Foundation系列はPSR-7ブリッジを併用 Nextat Inc. 50 -
Laravel Octane https://github.com/laravel/octane Laravel公式のパッケージ 高性能なアプリケーションサーバでパフォーマンスを向上 Swoole または RoadRunner この機会にRoadRunnerも流行って欲しい 今現在はSwoole限定の機能が多い?
Swoole Tables を使ったキャッシュなど Nextat Inc. 51 -
Spiral Framework https://spiral.dev/ Spiral Scout謹製。RoadRunner前提のFW ControllerやHTTP層の処理自体は他のFWとほぼ変わらず 注目すべきコンポーネント(独断) Cycle ORM: DoctrineライクなORM
ジョブキュー: 開発用にはRoadRunner単体で利用できる WebSocket Temporal 連携: ワークフローエンジン Nextat Inc. 52 -
(1) メモリリーク RoadRunnerは利用メモリが多くなったWorkerを入れ替える設定も可能 だが、当然メモリリークがないほうが良い 注意してコードを書くと共に、信頼できるFWやライブラリを使うことも重要 (2) グローバルな状態の汚染 global、static変数の変更が共有される Worker間での状態の共有はないが、Worker内ではリクエストをまたぐ ログインユーザやセッションがリクエストをまたいで共有される恐怖
DI・サービスコンテナの中身、シングルトン HTTPリクエストやHTTPリクエストから導出されるものはコンテナに保持し ないのが簡単 もしくはリクエスト毎のスコープでオブジェクトを保持できるようにする Nextat Inc. 55 -
(3) リソースのロック 開いたリソースをすぐ閉じるのが基本 DBコネクションを監視 リクエストをまたぐファイルロックを避ける その他の注意事項はドキュメントを参照 Caveats Production Usage 他のAlt
PHP-FPMに比べると少なめな印象 Nextat Inc. 56 -
参考資料 RuadRunner公式サイト https://roadrunner.dev RoadRunner (スライド・ロシア語) https://docs.google.com/presentation/d/1YnymGamkustDeujhTJhyTN h9_UtayV7quzF-4H3W0tU PHP fwdays 2019
- Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"(スライド・ロシア語) https://www.slideshare.net/fwdays/anton-tsitou-designing-hybrid- gophp-applications-using-roadrunner PHPKonf 2020 - Anton Titov: Designing hybrid Go/PHP applications using RoadRunner(動画・英語) https://www.youtube.com/watch?v=mj6d-IGzSYE Nextat Inc. 60