PHPに非同期処理を提供してくれるSwooleプラグインについての学習メモ。
主に自分向けだけど、誰かの役に立つかもしれないので公開しておく。
About Swoole
PHPプラグイン。Peclで入れる模様。
いろんなモジュールがある。 https://www.swoole.co.uk/docs/module
TCP, UDP, UnixSocket, HTTP, WebSocket, Redisなど。 Clientも提供している。 Http/2 Clientもあるのか。
Linux Process Manager, Async File IO, etcなども。
MySQL, Redis Clientもあるな。 mysqlnd, mysqliの置き換えとして動くらしいから、 PHP -> C -> MySQL の全部を担当してくれるのか。
Install
Pecl, はmacOSだけになったらしい。Source落として自分でビルドしろと…
試したいだけならDockerfileのサンプルが用意されてるっぽい。Docker Hubに上がってないのかな?
https://www.swoole.co.uk/docs/get-started/try-docker
Server
調べることがあったら書く。
今のところphp-fpmの置き換えをしたいとは思っていないので後回し。
EventLoop
https://www.swoole.co.uk/docs/modules/swoole-event-loop
イベント駆動の処理を書けるのかな?サンプルだとSocket接続してstream処理のようなことをしてるように見える。
KafkaみたいなメッセージングツールのSubscriberをPHPで書きやすくなる…?
Coroutine
どこかのバージョンからSwooleパッケージから切り出されたっぽい。
GoのChannel相当のものもあって、ネット上のサンプルコードだとこれをよく見る気がする。 go()
で非同期処理が開始されたりdefer関数を呼んでたりでだいぶGoを意識してそう。
と思ったら go() + Swoole\Event::wait()
のパターンはdeprecatedになっている。Coroutine\run
で置き換えられたのかな。
この辺がCoroutineとして切り出されたからこっち使ってね、的なことなのかな。
しかし4.4.0-alpha版で試したらCoroutine\Run
が無いと言われてしまった。サンプルが壊れてんのかな。
所感
Serverとか TCP/UDP, WebSocket接続, Stream, プロセスやメモリ管理のようなPHPが隠蔽してくれるおかげで触らなくて(理解しなくて)済んでる低レイヤーを露出させてますね。ハイパフォーマンスなアプリケーションを作ろうと思うとこの辺の知識がどうしても必要になるということをPHPエンジニアに突きつける感じでいいですね。そんなにパフォーマンスが必要なものにPHPを使うのかというのはまぁそれはそれで。