Download - 第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
ReactPHPは もっと流行って欲しい
1CPUあたり500req/sを超えるHelloWorldを 実装する方法について
たなかひさてる @tanakahisateru
Pinoco developerPHPTAL contributorFirebug translation contributorYii framework userPhpStorm user
フルスタックエンジニア(笑)
ReactPHP• PHPでNode.jsのようなノンブロッキングI/O
• ひとつのプログラムがメモリに常駐
• I/O待ちの間に別のイベントの処理を同一プロセス内で実行
• というわけでプロセス数に対する効率が非常に高い並列処理が可能
例としてreact-httpで
普通のPHP
react-http
毎回やること
最初だけやること初期化前倒し
PHP react-http
これまでPHPerが知っていたそれは、他の言語からすれば全然マイクロフレームワークじゃなかった
Hello World デモ
Silex nginx php-fpm
Silex nginx php-fpm
Silex nginx php-fpm
228.54 trans/sec
react-http nginx
メンテ状況微妙なespressoをreact-0.4で動くようにして利用 espressoはSilexをベースにしたreact-httpのWAFです
react-http nginx
react-http nginx
734.81 trans/sec
通常の3倍
ちなみに…
<?php echo
<?php echo
1735.65 trans/sec
<?php echo 最強
まあネタはこのぐらいにして
速さではない 本当のメリット
レスポンス完了
…のあと、裏でやって おけばいいこと
応用アイデア• サイト上で他の多くのユーザーにプッシュ通知が発生するイベントが起きる
• イベントを起こした人にはレスポンスを返してしまい、その後で通知を分散処理 (react-zmq)
• 他のWeb SocketホストはすべてPub/Subで受ける
• レスポンス後でいいタスクは細切れのジョブにして、それを複数のワーカーが1件づつ取って処理する
というわけで HelloWorld とかどうでもいいです
本当は• PHPのWebページはロードバランサーで簡単にスケールアウト可能 → Reactそんなに嬉しくない
• バックエンド側で、ユーザーへのレスポンスより遅れてもいい、高負荷なタスクのための内部REST等に使う
• 裏でボトルネックになるシステム(ジョブキューの受付など)が大量の同時接続を処理したい時に有効
Webページには ReactPHP不要
• PHPのメリット = レスポンスを返せばすべて終わり
• 次のリクエストはすべて空っぽの状態から始まる、だからPHPは安全で開発しやすい
• レスポンスを返すのが目的の本質なら、普通にPHPのフルスタックフレームワークを使うべき
• でも、PHPの便利さを犠牲にしてでも、初期化の前倒しによる高速化と大量同時接続の受付が必要なとき…
• Node.js → コールバック地獄かPromise地獄、一瞬でも同期I/Oが許されないきつさ
• Go → ライブラリが…
• Erlang → 文法が…
• Scala Actor → コンパイル…JVM…
• PHP → みんなだいすき♪ サイト用のライブラリが再利用できる サイトと同じツールで開発できる 一瞬で済むなら同期I/Oしてもいいよね、よね
注意したいこと• ずっとメモリに常駐するので、ヘタすると普通PHPでは起きないようなメモリリークが起きます。たまに再起動する必要があるかも
• リクエストがクラスを専有できないからstatic使うライブラリはダメです(I/O待ちに入ったら別のリクエストにstaticやシングルトンを上書きされちゃう)
• Laravel、Yii、FuelPHP、あとCake3のコードの再利用はたぶんアウト
• で、SymfonyのHttpKernelはいけるので、ここに来てSilexが急浮上することになります → GitHubで php-pm 参照
こんなReactPHPのことを喋ってみたい人はぜひ、 PHPカンファレンス関西へ