Posted at

PHPで非同期+プロセス管理? PHP-FPMより15倍速いというPHP-PMというモノを知った(PHP-fpmじゃないよ!)



ref: https://tsh.io/blog/php-pm-guide-getting-started-with-the-process-manager/

先日、色々調べ物をしていたら、ReactPHPという変なのを見つけました。

https://reactphp.org/

ここで言うReactはJavascriptのReact.jsじゃないです。Reactパターン?スタイル?のReactです。(ReactJSも元はPHPのHTMLコンポーネントライブラリのXHPがベースらしいんですが https://qiita.com/ytake/items/2ee2c0e10c6ef6f040fa

PHPで非同期でマルチプロセスでってやつです。驚いたことにPHPで書かれています。

正直、「コレPHPで書くか?」って思ったんですが、面白そうだったので色々調べたらPHP-PMというものを見つけました。


PPM - PHP Process Manager

https://github.com/php-pm/php-pm

PPMと略すみたいです。

ReactPHPを使って、SymfonyやLaravelが動くPHPのmiddleware(PSR-15)として実装されている感じです。SymfonyのHttpKernelのAdapterとして動作するとのことです。なので、nginxはPPMのプロキシとして動作します。

PPMは実行されると8080番ポートとかでずっとListenし続け、PPMがPHPを子プロセスとしてcliで動かしてプロセス管理をするとの事で、利用するphp.iniはcli用の設定になります。

なので、利用するためにはPCNTLが必要であり、configureオプション--enable-pcntlが必要になります。

https://www.php.net/manual/ja/book.pcntl.php


Nginx + PHP-fpmの15倍速いらしい


メモリリークは健在

公式ページでは、主な課題に「メモリリーク!メモリリーク!メモリリーク! まあ、プロセス再起動されるからきっと大丈夫だよ」的な事が書いてあり、引用元の記事でも


PHP-PM could cause big memory leaks (there’s probably some issue with restarting workers); it consumed all of my memory and crashed my PC; it happened twice,


と「メモリリーク凄くてPCクラッシュしたわ」的な事が書いてあるので、ここは注意が必要そうです。


まとめ

正直、「えー!?本当に速くなんの?」という疑念が振り払えないし、PHPでプロセス制御するってのに感覚的な恐怖を覚えます。

メモリリークもPCクラッシュするほどって話だし、まだまだ発展途上なのかなぁという感じです。

が、きちんと検証せずに感情だけで判断してはダメなので、近いうちに色々試してみようと思います。

ちなみに、PHPで非同期処理ってのだとSwooleってのがあり、こっちはC++で書かれていてPECLモジュールにもなっているので、感覚的にはこっちの方が安心できる。

https://qiita.com/gorogoroyasu/items/44119f8b2ba725859018