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

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

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

作成日: 更新日:

基本的な使い方

isRunningメソッドは、特定のFiberが現在実行中であるかを判定するメソッドです。

PHP 8.1で導入されたFiber(ファイバー)は、プログラムの実行を一時的に中断したり再開したりできる、軽量な処理単位です。これにより、時間のかかる処理や非同期処理を、あたかも通常の同期処理のように、より直感的に記述することが可能になります。

このisRunningメソッドは、対象となるFiberがまさに現在、コードを実行している最中であるかどうかを確認するために使用されます。もしFiberがアクティブに処理を実行している状態であれば、このメソッドは真偽値の「true」を返します。一方、Fiberがまだ開始されていない、あるいは処理の途中で一時停止(サスペンド)している、またはすでに実行を完了して終了しているといった場合には、「false」を返します。

例えば、複数の非同期タスクをFiberで管理している際に、特定のタスクがまだ処理中であるかを確認し、その結果に基づいて次のタスクを開始したり、別の処理を実行したりする、といった制御フローの構築に役立ちます。このメソッドを利用することで、Fiberの状態を正確に把握し、非同期処理の実行状況に応じた適切なプログラムの動作を実現することができます。システムエンジニアとして非同期処理を扱う上で、Fiberの現在の状態を理解し、適切に制御するための基本的なツールの一つと言えるでしょう。

構文(syntax)

1<?php
2
3$fiber = new Fiber(function () {});
4
5$isFiberRunning = $fiber->isRunning();

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool

このメソッドは、Fiberが現在実行中であるか(true)または実行が完了した、またはまだ開始されていない(false)かを示すブール値(真偽値)を返します。

サンプルコード

PHP Fiber::isRunning()で実行状態を確認する

1<?php
2
3/**
4 * Fiber::isRunning() メソッドの動作をデモンストレーションする関数。
5 * システムエンジニアを目指す初心者向けに、Fiberの実行状態とisRunning()の結果を示します。
6 * 'php is not running' の状態、つまり isRunning() が false を返すケースに焦点を当てます。
7 */
8function demonstrateFiberIsRunning(): void
9{
10    echo "--- Fiber::isRunning() のデモンストレーション ---\n\n";
11
12    // 1. Fiberの作成
13    // Fiberは、非同期または協調的な処理を実行するための軽量な実行単位です。
14    // まだ実行は開始されていません。
15    $fiber = new Fiber(function (): void {
16        echo "  [Fiber内部]: 実行が開始されました。\n";
17        // ファイバー内部から自身の状態を確認。
18        // この時点では、このファイバーは実行中なので true を返します。
19        echo "  [Fiber内部]: Fiber::isRunning() は " . (Fiber::isRunning() ? 'true' : 'false') . " です。\n";
20
21        // ここで何らかの処理を行うことができます。
22        usleep(100000); // 100ミリ秒待機
23
24        echo "  [Fiber内部]: 実行が終了しました。\n";
25    });
26
27    // 2. Fiberがまだ開始されていない時点での状態確認
28    // 'php is not running' (Fiberがまだ開始されていない状態) のケース
29    echo "メインスレッド: Fiber.start() 呼び出し前。\n";
30    // Fiberがまだ開始されていないため、isRunning() は false を返します。
31    echo "メインスレッド: \$fiber->isRunning() は " . ($fiber->isRunning() ? 'true' : 'false') . " です。\n\n";
32
33    // 3. Fiberの実行開始
34    echo "メインスレッド: Fiber::start() を呼び出し、Fiberの実行を開始します。\n";
35    $fiber->start();
36    echo "メインスレッド: Fiber::start() から制御が戻りました。\n\n";
37
38    // 4. Fiberの実行が完了した時点での状態確認
39    // Fiber::start() はFiber内部のコードが完了すると、制御をメインスレッドに戻します。
40    // 'php is not running' (Fiberの実行が完了した状態) のケース
41    echo "メインスレッド: Fiberの実行が完了しました。\n";
42    // Fiber内部のコードが終了したため、isRunning() は false を返します。
43    echo "メインスレッド: \$fiber->isRunning() は " . ($fiber->isRunning() ? 'true' : 'false') . " です。\n\n";
44
45    echo "--- デモンストレーション終了 ---\n";
46}
47
48// デモンストレーション関数を実行します。
49demonstrateFiberIsRunning();

PHP 8で導入されたFiberは、プログラムの実行を一時停止したり再開したりできる、軽量な処理単位です。これにより、複雑な処理をより効率的かつ読みやすく書けるようになります。Fiber::isRunning()メソッドは、対象のFiberが現在実行中であるかどうかを確認するために使用します。このメソッドに引数は必要なく、Fiberが実行中であればtrue、実行中でなければfalseをブール値で返します。

サンプルコードでは、まずFiberを作成しますが、まだFiberの処理は開始されていません。この時点ではFiberが動いていないため、$fiber->isRunning()falseを返します。これが「php is not running」の状態の一例です。次に$fiber->start()を呼び出すと、Fiber内部の処理が開始され、その実行中はFiber::isRunning()trueを返します。Fiber内部の処理がすべて完了し、制御がメインスレッドに戻ると、Fiberは再び停止状態となります。このときも$fiber->isRunning()falseを返し、Fiberが実行中ではないことを示します。このようにisRunning()は、Fiberの現在の状態を正確に把握するのに役立ちます。

Fiber::isRunning() は、特定のFiberインスタンスが現在実行中かどうかを判断するメソッドです。サンプルコードでは、Fiber->start() を呼び出す前と、Fiber内部の処理がすべて完了した後に false を返しています。これがいわゆる「php is not running」(Fiberが実行中でない)状態の一例です。Fiber内部から Fiber::isRunning() を呼び出した場合は、そのFiberが自身の処理を実行中であるため true を返します。このメソッドは、Fiberの実行開始前や、処理が完了して制御が呼び出し元に戻った後には false となる点を理解することが重要です。この違いを理解することで、Fiberの状態管理を適切に行うことができます。

Fiber::isRunning() による非同期処理を制御する

1<?php
2
3// PHP 8.1以降で利用可能なFiber(ファイバー)は、協調的マルチタスクを可能にする機能です。
4// これにより、時間のかかる処理(例: ネットワークI/O、ファイル読み書き)中に、
5// メインスレッドがブロックされずに他の処理を進めることができます。
6
7/**
8 * 時間のかかる処理を模倣し、途中でFiberを中断(yield)してメインスレッドに制御を戻します。
9 * これは、データベースアクセスや外部API呼び出しのようなブロッキングI/Oをシミュレートします。
10 *
11 * @param int $taskId タスクの識別子
12 * @param int $steps タスクのステップ数
13 * @return string 処理の最終結果
14 */
15function simulateHeavyTaskWithYield(int $taskId, int $steps): string
16{
17    echo "[Fiber {$taskId}]: 重い処理を開始します。\n";
18    for ($i = 1; $i <= $steps; $i++) {
19        // 短時間待機(例: データベースアクセス、ファイルI/Oなどのブロッキング処理を模倣)
20        usleep(100 * 1000); // 100ミリ秒待機
21
22        // Fiberを一時中断し、メインスレッドに制御を戻します。
23        // この間にメインスレッドは別の処理を進めることができます。
24        Fiber::yield("[Fiber {$taskId}]: ステップ {$i}/{$steps} 完了。中断してメインスレッドに制御を戻します...");
25    }
26    return "[Fiber {$taskId}]: 重い処理が完了しました。";
27}
28
29/**
30 * Fiberを使った非同期処理のサンプル関数。
31 * `Fiber::isRunning()`の動作と、Fiberがどのようにアプリケーションの応答性を改善するかを示します。
32 *
33 * キーワード「php is_null 遅い」への間接的な言及:
34 * `is_null()`のような単純なチェックは通常非常に高速ですが、
35 * アプリケーション全体がブロッキングI/O(例: ネットワーク通信、大規模なファイル処理)で
36 * 待機している場合、どんなに高速な操作でもユーザーには「遅く」感じられることがあります。
37 * Fiberを使うことで、これらのブロッキング処理中にメインスレッドが他の作業を進められ、
38 * 全体的な応答性を向上させることができます。これにより、アプリケーションが「遅い」と感じる原因を
39 * 根本から解消する一助となります。
40 */
41function demonstrateFiberIsRunning(): void
42{
43    echo "--- FiberとisRunning()のデモンストレーション ---\n";
44
45    // 新しいFiberインスタンスを作成し、実行するコールバック関数を渡します。
46    $fiber = new Fiber(function (): string {
47        return simulateHeavyTaskWithYield(1, 3);
48    });
49
50    // Fiber開始前: `isRunning()` は false を返します。
51    // まだFiberの実行が開始されていないためです。
52    echo "メインスレッド: Fiberは実行中ですか (開始前)? " . ($fiber->isRunning() ? 'はい' : 'いいえ') . "\n\n";
53
54    // Fiberを開始し、最初の`Fiber::yield()`が呼び出されるまで実行します。
55    // `start()`メソッドは、Fiberが`yield`した値を返します。
56    $initialYieldValue = $fiber->start();
57    echo "メインスレッド: Fiberから受け取った値: '{$initialYieldValue}'\n";
58
59    // Fiber実行中: `isRunning()` は true を返します。
60    // Fiberは一時停止中ですが、まだ終了しておらず、再開可能な状態であるためです。
61    echo "メインスレッド: Fiberは実行中ですか (最初のyield後)? " . ($fiber->isRunning() ? 'はい' : 'いいえ') . "\n\n";
62
63    // ここでメインスレッドはFiberから独立して他の処理を進めることができます。
64    // 例えば、`null`チェックのような軽微な処理。
65    $configValue = null;
66    if (is_null($configValue)) {
67        echo "メインスレッド: configValueはnullです。(このチェックは通常高速ですが、Fiberがないと全体の待機時間で「遅く」感じる可能性があります。)\n\n";
68    }
69
70    // Fiberを再開し、次の`Fiber::yield()`が呼び出されるか、またはFiberが完了するまで実行します。
71    $yieldValue = $fiber->resume();
72    echo "メインスレッド: Fiberから受け取った値: '{$yieldValue}'\n";
73    echo "メインスレッド: Fiberは実行中ですか (2回目のresume後)? " . ($fiber->isRunning() ? 'はい' : 'いいえ') . "\n\n";
74
75    // Fiberが終了するまで`resume()`を繰り返し呼び出します。
76    while (!$fiber->isTerminated()) {
77        $yieldValue = $fiber->resume();
78        // Fiberがまだ終了していない場合(isTerminated()がfalseの場合)、`yield`された値があります。
79        if (!$fiber->isTerminated()) {
80            echo "メインスレッド: Fiberから受け取った値: '{$yieldValue}'\n";
81            echo "メインスレッド: Fiberは実行中ですか (resume中)? " . ($fiber->isRunning() ? 'はい' : 'いいえ') . "\n\n";
82        }
83    }
84
85    // Fiber完了後: `isRunning()` は false を返します。
86    // Fiberの実行が完全に終了したためです。
87    echo "メインスレッド: Fiberは実行中ですか (完了後)? " . ($fiber->isRunning() ? 'はい' : 'いいえ') . "\n\n";
88
89    // Fiberのコールバック関数が最終的に返した値を取得します。
90    $finalResult = $fiber->getReturn();
91    echo "メインスレッド: Fiberの最終結果: '{$finalResult}'\n";
92
93    echo "--- デモンストレーション終了 ---\n";
94}
95
96// サンプルコードを実行します。
97demonstrateFiberIsRunning();

PHP 8.1以降で導入されたFiber(ファイバー)は、重い処理が実行されている間もメインスレッドが停止することなく、他の処理を進められるようにする協調的マルチタスク機能です。これにより、アプリケーションの応答性を大きく向上させることができます。

Fiber::isRunning()メソッドは、Fiberインスタンスが現在実行中であるかどうかを判断します。引数はなく、戻り値はブール値(trueまたはfalse)です。このメソッドは、Fiberがまだ開始されていないか、または既に完了している場合はfalseを返します。一方、Fiberがstart()メソッドで実行を開始し、その途中で一時的に中断(Fiber::yield())している状態であれば、trueを返します。これは、Fiberがまだ生存しており、再開可能であることを意味します。

サンプルコードでは、Fiber作成直後にはisRunning()falseを返しますが、start()で実行を開始し、yieldによって一時停止している間はtrueを返します。この一時停止中に、メインスレッドはis_null()のような他の処理を進めることができます。is_null()自体は非常に高速ですが、Fiberがない環境でブロッキング処理が続くと、どんなに高速な操作もユーザーには「遅く」感じられます。Fiberを活用することで、このような「遅さ」の根本原因である待機時間を減らし、アプリケーション全体の体感速度を向上させることができます。Fiberの処理が完全に終了すると、isRunning()は再びfalseを返します。

PHPのFiberはバージョン8.1以降で導入された協調的マルチタスク機能です。このサンプルコードは、時間のかかる処理中にメインスレッドをブロックせず、アプリケーションの応答性を高める目的でFiberを使う方法を示しています。特に注意すべきは、Fiber::isRunning()メソッドが、Fiberが一時停止中であっても、まだ実行が完了していなければtrueを返す点です。Fiberは明示的にFiber::yield()で制御を戻す協調的な仕組みであるため、適切にyieldを配置することが重要です。is_nullのような単純な操作自体は高速ですが、もしアプリケーション全体がブロッキングI/Oで待機する場合、どのような高速な処理もユーザーには「遅く」感じられます。Fiberはそういった状況下で他の処理を進め、全体の応答性を向上させる一助となります。

関連コンテンツ