SlideShare a Scribd company logo
ReactPHPは
もっと流行って欲しい
1CPUあたり500req/sを超えるHelloWorldを
実装する方法について
たなかひさてる
@tanakahisateru
Pinoco developer

PHPTAL contributor

Firebug translation contributor

Yii framework user

PhpStorm 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カンファレンス関西へ

More Related Content

第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai