Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RoadRunnerの世界 〜 Yet Another Alt PHP-FPM

RoadRunnerの世界 〜 Yet Another Alt PHP-FPM

2021/05/29(土)PHPカンファレンス沖縄2021の登壇資料です

n1215

May 29, 2021
Tweet

More Decks by n1215

Other Decks in Programming

Transcript

  1. 自己紹介 from 京都 - 中榮健二 (なかえけんじ) - twitter: @n_1215  -

    株式会社Nextat 取締役 - Laravel中心にECサイトやシステム開発 - 最近はFaaS+TSを使ったりUnityを使ったりPHP以外の仕事も増加 Nextat Inc. 2
  2. 発表概要 1. Alt PHP-FPMとは 2. RoadRunnerとは 3. RoadRunnerの設計思想 4. Get

    Started with RoadRunner 5. フレームワーク インテグレーション 6. 利用上のハマりどころ 7. まとめ Nextat Inc. 3
  3. 1-3. Alt PHP-FPM 従来のPHPとは異なる実行方式を持つ新興のHTTP・アプリケーションサーバを 本資料では Alt PHP-FPM と呼称 Swoole ReactPHP

    Amp PHP-PM (PHP Process Manager) ※ ApacheやLighttpdやIISのことも忘れてませんが、一旦置いておいてください Nextat Inc. 8
  4. 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
  5. 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
  6. Software Gunslinger - PHP is meant to die, continued 前記事の補足記事

    (現時点では)継続的に実行させるプロセスにPHPは向いていない、という主旨 ReactPHPの検証 メモリーリークの問題、安定性の問題 ReactをWorkerで実行する方法なら望みはあるかも、という事も書いてある Nextat Inc. 24
  7. RoadRunnerの開発者 https://github.com/wolfy-j Anton Titov 氏 (a.k.a Wolfy-J) Spiral Scout CTO・共同創業者。Twitter

    @lachezis 日本語Tweetにも「それRoadRunnerで出来るよ」とリプをくれるナイスガイ RoadRunnerに関するツイートは全て補足されている模様 本資料の大半は氏の発表資料、動画を参考にしています Nextat Inc. 26
  8. 既存の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
  9. Goridgeの実装に利用されたパッケージ Golang バイナリの扱い: encoding/binary 標準入出力: io UNIX, TCP: net PHP

    バイナリの扱い: pack(), unpack() 標準入出力: 組込みのストリーム Unix, TCP: 組込みのソケット Nextat Inc. 40
  10. ブログ記事: 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
  11. インストール $ 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
  12. 設定ファイル .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
  13. 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
  14. 多くの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
  15. 参考資料 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