PHPの非同期対応 これまでとこれから

>100 Views

August 15, 26

スライド概要

同期処理と非同期処理の違いを整理し、従来の stream_select() が持つ OS 依存やファイルディスクリプタ数の制限といった課題を説明しています。その上で PHP 8.6 で導入された Polling API(Io\Poll)を紹介し、Context・Backend・StreamPollHandle・Event・Watcher の 5 つの構成要素と基本的な使用手順を示しています。また、ReactPHP・Swoole・FrankenPHP などの非同期ライブラリが共通の I/O 監視基盤として Io\Poll を採用する可能性があることにも触れ、今後の PHP 非同期処理の展望を示しています。

おすすめタグ:PHP,非同期,Polling API,Io\Poll,ストリーム監視

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

PHPの非同期対応 これまでとこれから PHP 8.6 / Polling API 1

2.

プロフィール 発表者 ma@me 所属 最近の業務 品質改善・不具合対応 2

3.

同期と非同期の整理 同期 1つの処理が終わるまで、次の処理へ進まない。 例 電卓アプリ、画像変換アプリ、CSV集計アプリ 非同期 待ち時間に別の処理へ進める。完了順は前後することがある。 例 チャットアプリ、通知アプリ、音声通話アプリ 3

4.

同期的なチャット:相手の処理終了を待つ Aさんが投稿する 投稿中、Bさんは待機する Aさん こんにちは! Bさん・送信待ち はじめまして! Aさんの投稿終了後、Bさんが投稿する Bさん はじめまして! 一つの投稿処理が終わるまで、次の投稿処理へ進まない 4

5.

非同期的なチャット:届いた投稿から処理する AさんとBさんがそれぞれ投稿する 相手の投稿終了を待たない Aさん こんにちは! Bさん はじめまして! サーバーは届いた投稿から処理・表示する Bさん・先に到着 はじめまして! Aさん・次に到着 こんにちは! 非同期では I/O(入出力)の完了順が一定でないため、 処理可能になったかどうか、I/O を監視する必要がある 5

6.

PHP4 からある標準 I/O 監視関数 stream_select() 複数のストリームを監視し、読み書き可能になったものを返す。 イベントループではなく、OS の select() を利用する I/O 監視関数。PHPマニュアル function stream_select( ?array &$read, ?array &$write, ?array &$except, ?int $seconds, ?int $microseconds = null ): int|false とても古の PHP っぽい、配列と参照渡しをふんだん使ったインターフェース 6

7.

stream_select() のメリット・デメリット メリット 外部拡張なしで利用できる 汎用性が高く、Linux / macOS / Windows など、主要な OS で利用できる デメリット 監視できるファイルディスクリプタ番号は、多くの環境で 1024 未満 監視対象が増えるほど、走査コストが大きくなる エッジトリガーやワンショット通知を利用できない 7

8.

PHP 8.6 の Polling API(Io\Poll)で 非同期 I/O の監視基盤が強化 複数のストリームが読み書き可能になったことを監視する PHP 共通のポーリング API を提供される select()以外の各 OS が特化して実装した監視 API を利用できるようになる *強化されるのは I/O 監視 API であり。イベントループではない点に注意。 RFC:https://wiki.php.net/rfc/poll_api 8

9.

イメージ図 PHP のコード ↓ 監視を登録・待機 ↑ Watcherを返す Polling API(Io\Poll) ↓ OS基盤で監視 ↑ 準備完了を通知 Linux macOS / BSD epoll kqueue Solaris Windows その他POSIX event ports WSAPoll poll 9

10.

( ) Polling API Io\Poll の構成要素5つ 1. Context 2. Backend 3. StreamPollHandle 4. Event 5. Watcher 10

11.
[beta]
ソースの流れ
Handle 部分はインターフェースのみ提供されているので、
実際に使うにはラッパークラスを自分で用意する必要がある。省略しているがここが一番
大変。
サンプルコード:https://wiki.php.net/rfc/poll_api#usage_examples
use Io\Poll\{Context, Event, StreamPollHandle};
// 1. OSに適したBackendを自動選択してContextを作る
$poll = new Context();
// 2. PHPのストリームを監視可能なHandleで包む
$handle = new StreamPollHandle($stream);
// 3. Readを登録。Watcherで条件変更・解除ができる
$watcher = $poll->add($handle, [Event::Read]);
// 4. 最大1秒待機し、発火したWatcherの配列を受け取る
$readyWatchers = $poll->wait(1);

11

12.

PHP の非同期処理を支えるライブラリや実行基盤への 影響 ReactPHP・Revolt・Swoole・FrankenPHP など 内部にある I/O 監視部分で、共通 APIの Io\Poll が採用される可能性あり 各プロジェクトによる採用は未確定だが、今後の動向に要注目 12

13.

PHP の非同期の未来は明るい ご清聴ありがとうございました 13