Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Fiber::isTerminated()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

isTerminatedメソッドは、PHPのFiberクラスに属し、特定のFiberインスタンスがその実行を完全に終了したかどうかを確認するメソッドです。PHP 8.1で導入されたFiberは、プログラムの実行を一時的に中断し、必要に応じて再開できる軽量な並行処理の仕組み(コルーチン)を提供します。これにより、非同期処理などをより柔軟かつ直感的に記述できるようになります。

このisTerminatedメソッドは、呼び出されたFiberが既にその役割を終え、これ以上実行されることがない状態にあるかどうかを判定します。具体的には、Fiberの処理が最後まで正常に実行された場合や、実行中に補足されなかった例外が発生して終了した場合にtrueを返します。Fiberがまだ実行中であるか、またはFiber::suspend()によって一時的に中断されている状態の場合にはfalseを返します。

isTerminatedtrueを返すFiberは、もはや再開することはできません。この点は、一時的な中断状態を示すFiber::isSuspended()とは異なります。isSuspended()はFiberが再開可能であることを意味しますが、isTerminated()はFiberがそのライフサイクルを終え、最終的な状態に達したことを示します。

このメソッドを使用することで、複数のFiberを協調させて動作させる場合に、どのFiberがすでに処理を終えたのかを正確に把握し、その後のプログラムのフローを適切に制御することができます。例えば、並行して実行されているタスク群の中で、特定のタスクが完了したことを確認してから次のステップへ進むようなシナリオで非常に有用です。

構文(syntax)

1<?php
2(new Fiber(fn() => null))->isTerminated();

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

Fiber::isTerminated メソッドは、Fiber が終了しているかどうかを示す真偽値(bool)を返します。true であれば終了しており、false であれば実行中または中断状態であることを示します。

サンプルコード

PHP Fiber::isTerminated() で終了状態を確認する

1<?php
2
3/**
4 * Fiber::isTerminated() メソッドの動作を示すサンプルコード。
5 *
6 * このメソッドは、Fiberが実行を完了し、終了状態にあるかどうかを返します。
7 * Fiberが一時停止中であっても、まだ実行が完了していなければ false を返します。
8 * PHP 8.1以降で利用可能です。
9 */
10
11// Fiberの実行内容を定義するコールバック関数
12$fiberCallback = function (): void {
13    echo "  [Fiber] 処理を開始しました。\n";
14
15    // 処理の一部を実行し、Fiberを一時停止させます。
16    // Fiber::suspend() を呼び出すと、Fiberの実行は一時的に停止し、
17    // suspend() に渡された値が Fiber::start() や Fiber::resume() の戻り値となります。
18    $suspendedValue = 'Fiberからの一時停止信号';
19    echo "  [Fiber] 一時停止します。({$suspendedValue})\n";
20    Fiber::suspend($suspendedValue);
21
22    // Fiber::resume() が呼ばれると、ここから処理が再開されます。
23    echo "  [Fiber] 処理を再開しました。\n";
24    echo "  [Fiber] 処理を完了しました。\n";
25};
26
27// 1. 新しいFiberインスタンスを作成します。
28$fiber = new Fiber($fiberCallback);
29
30echo "--- Fiber作成直後 ---\n";
31// Fiberはまだ実行されていないため、終了していません。
32// Fiber::isTerminated() は false を返します。
33echo "Fiberは終了済みか?: " . ($fiber->isTerminated() ? "はい" : "いいえ") . "\n\n";
34
35echo "--- Fiber実行開始 (一時停止まで) ---\n";
36// Fiberの実行を開始します。Fiber内のコードが実行され、
37// Fiber::suspend() に到達すると一時停止します。
38// suspend() に渡した値が $fiber->start() の戻り値となります。
39$startResult = $fiber->start();
40echo "Fiber::start() の戻り値: '{$startResult}'\n";
41
42// Fiberは一時停止中ですが、まだ実行は完了していないため、終了していません。
43// Fiber::isTerminated() は false を返します。
44echo "Fiberは終了済みか?: " . ($fiber->isTerminated() ? "はい" : "いいえ") . "\n\n";
45
46echo "--- Fiber実行再開 (完了まで) ---\n";
47// Fiberの実行を再開します。Fiber内の残りの処理が実行され、完了します。
48// Fiber::resume() の戻り値は、Fiberが最終的に終了する際に明示的に返した値 (あれば) ですが、
49// この例では何も返していないため、null になります。
50$resumeResult = $fiber->resume();
51echo "Fiber::resume() の戻り値: " . var_export($resumeResult, true) . "\n";
52
53// Fiberは全ての処理を完了したため、終了状態です。
54// Fiber::isTerminated() は true を返します。
55echo "Fiberは終了済みか?: " . ($fiber->isTerminated() ? "はい" : "いいえ") . "\n\n";
56
57// 再度isTerminatedを確認。一度終了したFiberの状態は変化しません。
58echo "--- Fiber完全に終了後 (再度確認) ---\n";
59echo "Fiberは終了済みか?: " . ($fiber->isTerminated() ? "はい" : "いいえ") . "\n";
60

Fiber::isTerminated()は、PHP 8.1以降で利用可能なFiberクラスのメソッドです。Fiberは、実行を一時停止したり再開したりできる軽量なコルーチンのような機能を提供します。このメソッドは引数を取らず、対象のFiberの実行が完全に完了し、終了状態にあるかどうかを真偽値(bool)で返します。

具体的には、Fiberがまだ開始されていない状態や、Fiber::suspend()によって一時停止している状態では、まだ実行が残っているためfalseを返します。Fiber内のすべての処理が実行され、完全に終了した時点で初めてtrueを返します。

サンプルコードでは、まずFiberが作成された直後には実行されていないため、isTerminated()は「いいえ(false)」を返します。次にFiber::start()で実行を開始し、途中で一時停止させても、Fiberは一時停止中ではありますがまだ処理が残っているため、isTerminated()は引き続き「いいえ(false)」を返します。最後にFiber::resume()で残りの処理を完了させると、Fiberは終了状態となり、isTerminated()は「はい(true)」を返すようになります。このメソッドはFiberの最終的な実行完了状態を確認するために使用されます。

Fiber::isTerminated()は、Fiberが全ての処理を完了し、完全に終了した状態かを確認します。初心者が間違いやすい点として、FiberがFiber::suspend()で一時停止している間は、まだ実行が残っているためfalseを返します。全ての処理が完了するか、例外などで終了した場合にのみtrueとなります。一度終了状態(true)になると、そのFiberの状態は変化しません。このメソッドはPHP 8.1以降で利用可能ですので、PHPのバージョンを確認してください。Fiberのライフサイクルを理解し、現在の処理状態を正確に判断するために活用してください。

PHP Fiber::isTerminated() で終了状態を確認する

1<?php
2
3// PHP 8.1以降で導入されたFiber::isTerminated()メソッドの使用例を示す関数です。
4// Fiberは、コルーチン(協調的マルチタスク)を実装するための機能で、
5// 軽量なスレッドのように非同期処理を実現するのに役立ちます。
6// isTerminated()は、特定のFiberが実行を完了したか、または例外によって終了したかを確認するために使用されます。
7function demonstrateFiberIsTerminated(): void
8{
9    echo "--- Fiber::isTerminated() デモンストレーション ---\n\n";
10
11    // シナリオ1: Fiberがまだ開始されていない状態
12    // Fiberは作成されただけで、start()メソッドが呼ばれていないため、実行されていません。
13    // この段階では、Fiberは終了状態ではないため、isTerminated()は false を返します。
14    $fiberNotStarted = new Fiber(function (): void {
15        // このFiberが開始されない限り、このメッセージは表示されません。
16        echo "  [Fiber not started] このメッセージは表示されません。\n";
17    });
18    echo "1. Fiberが開始される前:\n";
19    echo "   isTerminated: " . var_export($fiberNotStarted->isTerminated(), true) . " (期待値: false)\n\n";
20
21    // シナリオ2: Fiberが開始され、yieldで一時停止している状態
22    // Fiber::yield()によって一時停止している間は、まだ実行中とみなされ、終了状態ではありません。
23    // そのため、isTerminated()は false を返します。
24    $fiberYielding = new Fiber(function (): void {
25        echo "  [Fiber yielding] 処理の最初の部分を実行中...\n";
26        // Fiber::yield()で実行を中断し、呼び出し元に制御を戻します。
27        // ここで一旦実行が止まるため、Fiberはまだ完了していません。
28        Fiber::yield();
29        echo "  [Fiber yielding] 処理の残りの部分を実行中...\n";
30        echo "  [Fiber yielding] 処理が完了しました。\n";
31    });
32
33    echo "2. Fiberがyieldで一時停止している状態:\n";
34    // Fiberを開始すると、最初の Fiber::yield() まで実行され、そこで一時停止します。
35    $fiberYielding->start();
36    echo "   isTerminated (yield後): " . var_export($fiberYielding->isTerminated(), true) . " (期待値: false)\n";
37
38    // Fiberを再開して、残りの処理を実行させます。
39    // resume()を呼ぶと、Fiberの処理が最後まで実行され、完了状態になります。
40    $fiberYielding->resume();
41    echo "   isTerminated (resume後): " . var_export($fiberYielding->isTerminated(), true) . " (期待値: true)\n\n";
42
43
44    // シナリオ3: Fiberが正常に実行を完了した状態
45    // Fiber内の処理が最後まで実行されると、そのFiberは終了状態になります。
46    // この場合、isTerminated()は true を返します。
47    $fiberCompleted = new Fiber(function (): void {
48        echo "  [Fiber completed] 処理を実行中...\n";
49        // 通常の処理の完了
50        echo "  [Fiber completed] 処理が正常に完了しました。\n";
51    });
52
53    echo "3. Fiberが正常に実行を完了した状態:\n";
54    // Fiberを開始し、処理を最後まで実行させます。
55    $fiberCompleted->start();
56    echo "   isTerminated (完了後): " . var_export($fiberCompleted->isTerminated(), true) . " (期待値: true)\n\n";
57
58    // シナリオ4: Fiberが例外によって終了した状態
59    // Fiber内で例外が発生し、それがキャッチされずにFiberの外に伝播すると、そのFiberは終了状態になります。
60    // この場合も、isTerminated()は true を返します。
61    $fiberWithError = new Fiber(function (): void {
62        echo "  [Fiber error] エラーが発生する処理を実行中...\n";
63        throw new Exception("Fiber内で予期せぬエラーが発生しました!");
64    });
65
66    echo "4. Fiberが例外によって終了した状態:\n";
67    try {
68        // Fiberを開始し、例外を発生させます。
69        $fiberWithError->start();
70    } catch (Throwable $e) {
71        // Fiber内で発生した例外を外部でキャッチできます。
72        echo "  外部で例外をキャッチ: " . $e->getMessage() . "\n";
73    }
74    echo "   isTerminated (エラー後): " . var_export($fiberWithError->isTerminated(), true) . " (期待値: true)\n\n";
75
76    echo "--- デモンストレーション終了 ---\n";
77}
78
79// 上記のデモンストレーション関数を呼び出します。
80demonstrateFiberIsTerminated();

Fiber::isTerminated()は、PHP 8.1で導入された非同期処理を可能にするFiber(軽量なコルーチン)が、現在終了しているかどうかを判定するメソッドです。このメソッドは引数を取らず、戻り値は真偽値(bool)で、Fiberの状態に応じてtrueまたはfalseを返します。

具体的には、Fiberが作成されたばかりでまだ開始されていない状態や、Fiber::yield()によって一時停止している状態では、Fiberはまだ実行中または待機中であるため、isTerminated()falseを返します。これは、処理がまだ完全に終了していないことを示します。

一方、Fiber内の処理が最後まで実行されて正常に完了した場合、またはFiber内で未処理の例外が発生し、それが外部に伝播してFiberが終了した場合に、isTerminated()trueを返します。このメソッドを使うことで、非同期処理を管理する際に、Fiberが完全に完了したのか、または途中でエラーによって停止したのかを正確に判断でき、その後の処理を適切に制御できます。

このFiber::isTerminated()メソッドは、PHP 8.1以降で利用可能な機能ですので、開発環境のPHPバージョンを確認してください。このメソッドは、Fiberがコルーチンとしての実行を完全に完了したか、または例外によって終了したかを確認するために使用されます。特に注意すべきは、Fiber::yield()によって一時停止している状態は実行中とみなされ、isTerminated()falseを返す点です。trueを返すのは、Fiber内の処理が最後まで実行され正常に完了した場合か、またはFiber内で発生した例外が処理されずに終了した場合のみです。Fiberのライフサイクルと実行状態を正確に把握した上で、適切なタイミングでこのメソッドを利用することが大切です。

関連コンテンツ