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

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

作成日: 更新日:

基本的な使い方

suspendメソッドは、PHP 8.1で導入されたFiberクラスのインスタンスにおいて、現在実行中のFiberの処理を一時的に停止し、その制御をFiberを呼び出した元のコンテキストへと戻すメソッドです。

このメソッドが呼び出されると、Fiberの現在の実行状態(ローカル変数やプログラムカウンタなど)が保存され、Fiberは中断された状態になります。これは、時間のかかる処理の途中で他のタスクにCPUの実行権を譲り、プログラム全体の応答性を高めたい場合や、非同期的な処理フローを協調的に制御したい場合に非常に有用です。

一時停止されたFiberは、Fiber::resume()メソッドが明示的に呼び出されるまで、その実行を再開することはありません。suspendメソッドの戻り値は、Fiber::resume()メソッドに渡された引数となります。これにより、Fiberを中断している間に外部から値を受け取ることができます。同様に、suspendメソッドに引数を渡すことで、その値がFiber::resume()メソッドの戻り値として返され、外部へ値を渡すことも可能です。

このように、suspendメソッドはFiberを用いた軽量なコルーチンを実現し、プログラムの並行処理をより柔軟に、かつ効率的に記述するための重要な機能を提供します。

構文(syntax)

1public static Fiber::suspend(mixed $value = null): mixed

引数(parameters)

mixed $value = NULL

  • mixed $value = NULL: Fiberの実行を中断した際に、そのFiberに渡される値。デフォルトはNULL。

戻り値(return)

mixed

Fiber::suspend() メソッドは、現在のFiberの実行を一時停止し、そのFiberを実行しているコンテキストに値を返します。このメソッドが呼び出されると、Fiberの実行は中断され、Fiber::start() または Fiber::resume() メソッドに渡された値が suspend() の呼び出し元に返されます。

サンプルコード

PHP Fiber::suspend() による中断と再開

1<?php
2
3/**
4 * Fiber::suspend() の使用例
5 */
6
7function createFiber(): Fiber
8{
9    return new Fiber(function (string $name): string {
10        echo "Fiber started with name: $name\n";
11        $value = Fiber::suspend("Initial suspend");
12        echo "Fiber resumed with value: $value\n";
13        $value = Fiber::suspend("Second suspend");
14        echo "Fiber completed with value: $value\n";
15        return "Fiber finished";
16    });
17}
18
19$fiber = createFiber();
20
21// ファイバーを開始し、最初の suspend まで実行
22$result1 = $fiber->start("MyFiber");
23echo "Main context received: $result1\n";
24
25// ファイバーを再開し、次の suspend まで実行
26$result2 = $fiber->resume("First resume value");
27echo "Main context received: $result2\n";
28
29// ファイバーを再開し、実行を完了
30$result3 = $fiber->resume("Second resume value");
31echo "Main context received: $result3\n";
32echo "Fiber is dead: " . ($fiber->isTerminated() ? 'true' : 'false') . "\n";
33echo "Fiber return value: " . $fiber->getReturn() . "\n";

PHP 8のFiberクラスにおけるsuspend()メソッドは、ファイバーの実行を一時停止し、指定された値を呼び出し元に返します。引数$valueは省略可能で、一時停止時に渡す値を指定します。省略した場合はNULLが渡されます。このメソッドの戻り値は、ファイバーが再開された際にresume()メソッドに渡された値です。

サンプルコードでは、createFiber()関数内で新しいFiberオブジェクトを作成しています。このファイバーは、開始時に文字列$nameを受け取り、suspend()メソッドを2回呼び出して実行を一時停止します。それぞれのsuspend()の呼び出しで、異なる文字列が返されます。

メインの処理では、まずcreateFiber()でファイバーを作成し、start()メソッドでファイバーを開始します。start()メソッドに渡された"MyFiber"がファイバーに渡され、最初のsuspend()が実行されると、"Initial suspend"がメインコンテキストに返されます。次に、resume()メソッドを使ってファイバーを再開します。resume()メソッドに渡された"First resume value"がファイバーに渡され、次のsuspend()が実行されると、"Second suspend"がメインコンテキストに返されます。最後に、再度resume()メソッドを呼び出し、"Second resume value"をファイバーに渡します。ファイバーは処理を完了し、"Fiber finished"を返します。

isTerminated()メソッドでファイバーが終了したかを確認し、getReturn()メソッドでファイバーの戻り値を取得しています。この例では、suspend()メソッドを使用することで、ファイバーの実行を制御し、メインの処理との間で値を交換する方法を示しています。

Fiber::suspend()は、ファイバーの実行を一時停止し、指定された値を返します。初心者の方が注意すべき点として、suspend()を呼び出すと、ファイバーの実行が中断され、resume()が呼ばれるまで処理が進まないことが挙げられます。resume()に渡された値が、中断されたsuspend()の戻り値としてファイバー内で利用できる点も重要です。ファイバーがsuspend()を複数回呼び出す場合、resume()も同じ回数だけ呼び出す必要があります。最後に、ファイバーが完了すると、getReturn()で最終的な戻り値を取得できます。isTerminated()でファイバーが完了しているか確認することも重要です。