0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ファイバーについて

Posted at

たまたまマニュアルを読んでいたら、

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リクエスト捌く時の非同期処理とかに使えるかな?

実用例等があればぜひ教えていただきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?