たまたまマニュアルを読んでいたら、
PHP8.1から実装されたファイバーがどこかで使えそうだなーと思い、
学習と備忘録がてら記事にします。
ファイバー とは
PHP8.1から実装された、完全なスタックを持つ、停止可能な関数のことです。
ファイバーは、コールスタック中のどこからでも停止することができ、
非同期処理やブロッキングI/O操作に対して効果的らしいです。
// ユーザー定義関数を引数にし、ファイバーインスタンス生成
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "ファイバーの値: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "ファイバーの値: ", $value, PHP_EOL;
$fiber->resume('test');
ファイバーの値: fiber
ファイバーの値: test
実行スタック中のどこからでも、Fiber::suspend() を使って実行を停止できるため、
深くネストされている関数のコールスタックの中から行っても問題ないそう。
これは、Fiber自身がコールスタックを保持しているため、
suspend()が実行された停止ポイントを覚えているから
らしいです。
ファイバーが停止されると、
ファイバーの実行は Fiber::resume() に任意の値を渡すか、
Fiber::throw() を使ってファイバーに例外をスローさせることで再開できます。
再開される時は、Fiber::suspend() から値が返されます(または、例外がスローされます)。
上記コードは、マニュアルからまんまパクってきてますが、
かなり実用的でわかりやすいです。
suspendで引き渡した値は、resumeで引き渡した値に書き換わるみたいですね。
概要は理解したので、あとは実際に使ってみて実践知識つけてみます。
とはいえ現場どこで実装されるかはピンときていないです。
HTTPリクエスト捌く時の非同期処理とかに使えるかな?
実用例等があればぜひ教えていただきたいです。