【PHP8.x】resumeメソッドの使い方

resumeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

resumeメソッドは、一時停止中のファイバーの実行を再開するメソッドです。PHP 8.1で導入されたファイバーは、プログラムの実行フローを途中で一時停止し、後から任意のタイミングで再開できる軽量な並行処理の仕組みを提供します。このresumeメソッドは、主にFiber::suspend()メソッドによって実行が一時停止されたファイバーに対して使用されます。

具体的には、Fiber::suspend()が呼び出されると、ファイバーの実行は中断され、その時点でファイバーの実行を起動した側(親コンテキスト)に制御が戻ります。その後、親コンテキストからFiber::resume()を呼び出すことで、中断された箇所からファイバーの実行が再開されます。resume()メソッドには任意の値を引数として渡すことができ、その値はFiber::suspend()の戻り値としてファイバー内部で受け取ることができます。同様に、Fiber::suspend()から値を返すと、その値はFiber::resume()の戻り値として親コンテキストで受け取れます。

ファイバーはFiber::STATUS_SUSPENDED状態にある場合にのみresume()を呼び出すことができます。もし、実行中のファイバー(Fiber::STATUS_RUNNING)や、既に完了したファイバー(Fiber::STATUS_TERMINATED)に対してresume()を試みると、FiberError例外が発生しますので注意が必要です。このメソッドは、非同期処理の待機や協調的なマルチタスク処理、複雑なジェネレータのような振る舞いを実装する際に非常に有用です。

構文(syntax)

1<?php
2
3$fiber = new Fiber(function (): void {
4    Fiber::suspend();
5});
6
7$fiber->start();
8$fiber->resume("Value to pass.");

引数(parameters)

mixed $value = null

  • mixed $value = null: Fiber を resume する際に渡す値。デフォルトは null。

戻り値(return)

mixed

Fiber::resume() メソッドは、Fiber の実行を再開した際の戻り値を返します。これは、Fiber が yield された値、または Fiber の実行が完了した際の最終的な戻り値になります。

サンプルコード

PHP Fiber::resume() で値を渡して再開する

1<?php
2
3/**
4 * Fiber::resume() のサンプルコード。
5 *
6 * Fiber を再開し、値を渡す。
7 */
8
9function create_fiber(mixed $initialValue): Fiber
10{
11    return new Fiber(function (mixed $value) use ($initialValue): mixed {
12        echo "Fiber: 開始\n";
13        $received_value = Fiber::suspend($initialValue); // Fiber を中断し、初期値を返す
14        echo "Fiber: 中断から再開、受信した値: " . $received_value . "\n";
15        return $value; // 最後に渡された値を返す
16    });
17}
18
19// Fiber の初期値を設定
20$initial_value = "初期値";
21
22// Fiber を作成
23$fiber = create_fiber($initial_value);
24
25// Fiber が中断しているか確認
26echo "Fiber の状態: " . ($fiber->isSuspended() ? '中断' : '実行中') . "\n";
27
28// Fiber を開始し、初期値を受け取る
29$result1 = $fiber->resume();
30echo "main: Fiber から受信した値: " . $result1 . "\n";
31
32// Fiber が中断しているか確認
33echo "Fiber の状態: " . ($fiber->isSuspended() ? '中断' : '実行中') . "\n";
34
35
36// Fiber を再開し、値を渡す
37$result2 = $fiber->resume("再開時の値");
38echo "main: Fiber から受信した値: " . $result2 . "\n";
39
40// Fiber が完了しているか確認
41echo "Fiber の状態: " . ($fiber->isTerminated() ? '完了' : '実行中') . "\n";
42
43// Fiber の戻り値を取得
44echo "Fiber の戻り値: " . $fiber->getReturn() . "\n";

Fiber::resume() は、PHP 8 で導入された Fiber クラスのメソッドで、中断された Fiber を再開するために使用します。

このサンプルコードでは、create_fiber() 関数内で Fiber を作成しています。Fiber は、Fiber::suspend() によって中断され、その際に $initialValue が返されます。

$fiber->resume() を最初に呼び出すと、Fiber が開始され、Fiber::suspend() で指定された初期値(この例では "初期値")が返されます。この時点では、Fiber は Fiber::suspend() の実行後で中断状態になっています。

次に $fiber->resume("再開時の値") を呼び出すと、Fiber が中断状態から再開されます。resume() に渡された "再開時の値" は、Fiber::suspend() の戻り値として Fiber 内部で受け取られます。Fiber 内では、受け取った値が出力され、最後に resume() を呼び出す前に設定された $value (この例では"初期値")がFiberの戻り値として返されます。

Fiber::resume() の引数 $value は、中断された Fiber に渡す値です。戻り値は、Fiber 内で Fiber::suspend() が返す値、または Fiber の処理が完了した場合の Fiber 関数の戻り値です。このサンプルコードでは、Fiber が完了した後に $fiber->getReturn() で Fiber の戻り値を取得しています。

Fiber::resume()は、中断されたFiberを再開させるメソッドです。引数$valueは、Fiberの中断箇所(Fiber::suspend())で受け取ることができます。

このサンプルコードでは、最初にFiber::resume()を引数なしで呼び出していますが、これはFiberの最初の実行を開始する役割も果たします。2回目以降のFiber::resume()で引数を渡すと、Fiber内でFiber::suspend()が返した値として扱われます。

Fiberが完了すると、Fiber::resume()はFiber内で最後にreturnされた値を返します。Fiberが完了したかどうかは、Fiber::isTerminated()で確認できます。また、完了後のFiberのreturn値は、Fiber::getReturn()で取得できます。Fiberは一度完了すると、再度resumeすることはできませんので注意してください。

PHP Fiber::resume で実行を再開する

1<?php
2
3/**
4 * Fiber::resume() のサンプルコード
5 */
6
7// Fiberを定義
8$fiber = new Fiber(function (string $name): string {
9    // Fiberを中断し、値を返す
10    $greeting = Fiber::suspend("Hello, ");
11    return $greeting . $name . "!";
12});
13
14// Fiberを開始し、最初のsuspendまで実行
15$result = $fiber->start("World"); // "World" は Fiber の引数
16
17// suspend で返された値を確認
18echo "Fiber からの最初の戻り値: " . $result . PHP_EOL; // Fiber からの最初の戻り値: Hello,
19
20// Fiberを再開し、値を渡す
21$finalResult = $fiber->resume("Goodbye, "); // "Goodbye, " は suspend からの戻り値
22
23// Fiberの実行結果を表示
24echo "Fiber の最終的な戻り値: " . $finalResult . PHP_EOL; // Fiber の最終的な戻り値: Goodbye, World!

Fiber::resume()メソッドは、中断されたFiberを再開させるためのものです。このメソッドは、Fiberクラスに所属しており、PHP 8以降で使用できます。引数$valueは、中断されたFiberに渡す値で、型はmixed型です。省略した場合はnullが渡されます。この値は、Fiber内でFiber::suspend()によって中断された箇所で、その戻り値として利用できます。Fiber::resume()メソッドの戻り値もmixed型であり、Fiberが完了した場合は、Fiber内のクロージャの最終的な戻り値が返されます。

サンプルコードでは、まずFiberオブジェクトを生成しています。Fiberのクロージャ内では、Fiber::suspend()を使用してFiberを中断し、文字列"Hello, "を返しています。次に、$fiber->start("World")でFiberを開始し、最初のFiber::suspend()まで実行します。$fiber->start()に渡した"World"は、Fiberのクロージャの引数$nameに渡されます。この時点でFiberは中断され、$resultには"Hello, "が格納されます。

その後、$fiber->resume("Goodbye, ")を呼び出すことでFiberが再開されます。Fiber::resume()に渡した"Goodbye, "は、Fiber::suspend()の戻り値としてFiber内の$greeting変数に格納されます。Fiberは中断された箇所から処理を再開し、"Goodbye, "と"World"を連結して、最終的な戻り値"Goodbye, World!"を返します。この戻り値は$finalResultに格納され、最後に表示されます。Fiber::resume()を使うことで、Fiberの状態を制御し、値をやり取りしながら処理を進めることが可能になります。

Fiber::resume()は、中断されたFiberを再開するメソッドです。引数$valueは、Fiber::suspend()によって中断された箇所に返される値となります。サンプルコードでは、Fiber内でsuspend()で中断された際に"Hello, "が返され、resume("Goodbye, ")でFiberを再開する際に"Goodbye, "がFiber内に渡されています。Fiberを開始するにはstart()を使用し、再開にはresume()を使用します。start()でFiberに引数を渡すことができ、resume()でsuspend()から値を返すことができます。Fiberが完了すると、resume()はFiberのreturn文で指定された値を返します。Fiberがすでに完了している場合、resume()を呼び出すとError例外が発生しますので注意が必要です。

【PHP8.x】resumeメソッドの使い方 | いっしー@Webエンジニア