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

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

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

作成日: 更新日:

基本的な使い方

getCurrentメソッドは、PHPのFiberクラスに属し、現在アクティブなFiberインスタンスを取得するために使用されるメソッドです。PHP 8.1で導入されたFiberは、プログラム内で協調的なマルチタスクを実現するための軽量な実行単位であり、コルーチンとも呼ばれます。これにより、重い処理を途中で一時停止し、別の処理に切り替えてから再び元の処理を再開するといった、効率的な処理の流れを構築できます。

このgetCurrentメソッドは、コードがどのFiberのコンテキスト(実行環境)内で動作しているのかを特定したい場合に非常に役立ちます。例えば、特定のFiberの状態を監視したり、複数のFiber間でのデータ共有や同期処理を実装したりする際に、現在実行中のFiberを正確に把握するために利用されます。

メソッドを呼び出した際、もし現在どのFiberのコンテキスト内でも実行されていない場合、具体的には通常のスクリプト実行や、まだFiberが開始されていない状況では、このメソッドはnullを返します。そのため、getCurrentメソッドの戻り値は、常にFiberインスタンスであるとは限らず、nullが返される可能性を考慮し、適切な条件分岐処理を実装することが重要です。これにより、開発者は現在のコードがFiberによって管理されているかどうかを判別し、状況に応じた柔軟なプログラムを作成できます。

構文(syntax)

1<?php
2
3$currentFiber = Fiber::getCurrent();

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Fiber

このメソッドは、現在実行中の Fiber インスタンス、または Fiber が実行されていない場合は null を返します。

サンプルコード

PHP 8.1 Fiber::getCurrent() で現在のファイバーを取得する

1<?php
2
3/**
4 * PHP 8.1で導入されたFiber (ファイバー) の基本的な使い方と
5 * 現在実行中のファイバーを取得する Fiber::getCurrent() の使用例を示します。
6 *
7 * ファイバーは、協調的なマルチタスクを実現するための軽量なコルーチンです。
8 * メインスクリプトとファイバー間で処理を一時停止・再開できます。
9 */
10
11// 1. メインコンテキストで Fiber::getCurrent() を呼び出す
12//    現在、どのファイバーも実行されていないため、null が返されます。
13echo "--- メインコンテキストでの getCurrent() ---" . PHP_EOL;
14echo "現在、メインスクリプトの実行中です。" . PHP_EOL;
15
16$currentFiberInMain = Fiber::getCurrent();
17
18if ($currentFiberInMain === null) {
19    echo "  -> Fiber::getCurrent() は null を返しました。これは、現在ファイバーが実行されていないことを意味します。" . PHP_EOL;
20} else {
21    echo "  -> Fiber::getCurrent() は Fiber オブジェクトを返しました。(通常、メインコンテキストではnullです。)" . PHP_EOL;
22}
23echo PHP_EOL;
24
25// 2. ファイバーを作成し、その中で Fiber::getCurrent() を呼び出す
26echo "--- ファイバー内での getCurrent() ---" . PHP_EOL;
27
28// 新しいファイバーを作成します。
29$fiber = new Fiber(function (): void {
30    echo "  [ファイバー内] ファイバーの処理を開始します。" . PHP_EOL;
31
32    // ファイバーの内部で Fiber::getCurrent() を呼び出します。
33    // この時点では、このファイバー自身が実行中であるため、自身のインスタンスが返されます。
34    echo "  [ファイバー内] Fiber::getCurrent() を呼び出し中..." . PHP_EOL;
35    $innerFiber = Fiber::getCurrent();
36
37    if ($innerFiber instanceof Fiber) {
38        echo "    -> Fiber::getCurrent() は Fiber オブジェクトを返しました。" . PHP_EOL;
39        // 厳密には、ここで返された $innerFiber が外で定義した $fiber と同じインスタンスであることを確認できます。
40        // (直接比較はできませんが、デバッグ目的でオブジェクトIDなどを比較できます)
41    } else {
42        echo "    -> Fiber::getCurrent() は null を返しました。(ファイバー内では通常発生しません。)" . PHP_EOL;
43    }
44
45    echo "  [ファイバー内] メインスクリプトに処理を一時停止し、制御を戻します。" . PHP_EOL;
46    // Fiber::suspend() を呼び出すと、ファイバーは一時停止し、指定した値をメインスクリプトに返します。
47    Fiber::suspend('ファイバーからの一時停止メッセージ');
48
49    echo "  [ファイバー内] メインスクリプトから処理が再開されました。" . PHP_EOL;
50    echo "  [ファイバー内] ファイバーの処理を終了します。" . PHP_EOL;
51});
52
53echo "メイン: ファイバーを開始します。" . PHP_EOL;
54// Fiber::start() を呼び出すと、ファイバーの実行が開始されます。
55// ファイバーが Fiber::suspend() を呼び出すまで、このメソッドはブロックされます。
56$messageFromFiber = $fiber->start();
57echo "メイン: ファイバーが一時停止し、制御が戻りました。ファイバーからのメッセージ: '$messageFromFiber'" . PHP_EOL;
58echo PHP_EOL;
59
60echo "メイン: ファイバーが終了したか確認します。" . PHP_EOL;
61if ($fiber->isTerminated()) {
62    echo "メイン: ファイバーはすでに終了しています。" . PHP_EOL;
63} else {
64    echo "メイン: ファイバーはまだ実行中なので、再開します。" . PHP_EOL;
65    // Fiber::resume() を呼び出すと、一時停止していたファイバーの処理が再開されます。
66    // ファイバーが完全に終了するまで、このメソッドはブロックされます。
67    $fiber->resume('メインからの再開メッセージ');
68    echo "メイン: ファイバーの処理が完全に完了しました。" . PHP_EOL;
69}
70echo PHP_EOL;
71
72// 3. ファイバー終了後のメインコンテキストで Fiber::getCurrent() を呼び出す
73//    ファイバーは終了したため、再度 null が返されます。
74echo "--- ファイバー終了後のメインコンテキストでの getCurrent() ---" . PHP_EOL;
75
76$currentFiberAfterTermination = Fiber::getCurrent();
77
78if ($currentFiberAfterTermination === null) {
79    echo "  -> Fiber::getCurrent() は null を返しました。ファイバーはすでに終了しています。" . PHP_EOL;
80} else {
81    echo "  -> Fiber::getCurrent() は Fiber オブジェクトを返しました。(通常、ファイバー終了後はnullです。)" . PHP_EOL;
82}
83echo "--- 全ての処理が完了しました ---" . PHP_EOL;

PHP 8.1で導入されたFiberは、協調的なマルチタスクを実現する軽量なコルーチンです。このサンプルコードは、現在実行中のファイバーインスタンスを取得するFiber::getCurrent()メソッドの基本的な使い方を示しています。このメソッドは引数を取らず、戻り値として現在実行中のFiberオブジェクト、またはファイバーが実行されていない場合はnullを返します。

コードの冒頭では、メインスクリプトでFiber::getCurrent()を呼び出しており、この時点ではファイバーが実行されていないためnullが返されます。次に、新しいファイバーを作成し、その内部でFiber::getCurrent()を呼び出します。ファイバー実行中は、このメソッドは現在実行中のファイバー自身のインスタンスを返します。その後、Fiber::suspend()で処理を一時停止し、メインスクリプトに制御を戻します。メインスクリプトが$fiber->resume()で処理を再開すると、ファイバーは終了まで実行されます。ファイバーが完全に終了した後、再度メインスクリプトでFiber::getCurrent()を呼び出すと、もはや実行中のファイバーがないため、再びnullが返されることが確認できます。このようにFiber::getCurrent()は、現在の実行コンテキストがファイバー内であるか、またはどのファイバーがアクティブであるかを判別する際に役立ちます。

Fiber::getCurrent()は、現在実行中のファイバーインスタンスを取得するメソッドです。このメソッドは、メインスクリプトの実行中やファイバーが実行中でない場合はnullを返します。一方、ファイバー内部で呼び出すと、現在処理中のそのファイバー自身のインスタンスが返されますので、呼び出すコンテキストに注意が必要です。戻り値が?Fiber型であるため、常にnullチェックを行い、返された値が実際にFiberオブジェクトであるかを確認することが、予期せぬエラーを防ぐ上で非常に重要です。このメソッドは、現在実行中のファイバーの識別や制御を行う場合に利用します。

PHP Fiber::getCurrent() で現在時刻を取得する

1<?php
2
3// このコードはPHP 8.1以降で動作します。
4// ファイバー機能はPHP 8.1で導入されました。
5
6/**
7 * ファイバーのコンテキスト内で現在の日付と時刻を取得し、
8 * 現在実行中のFiberインスタンスを確認するサンプルです。
9 *
10 * キーワード "php getcurrentdate" に基づき、現在の日付・時刻の取得方法を示し、
11 * リファレンス情報 "Fiber::getCurrent()" の使用例を組み合わせています。
12 */
13function demonstrateFiberAndCurrentDate(): void
14{
15    echo "--- メインコンテキストから開始 ---\n";
16
17    // メインコンテキストで現在の日付と時刻を取得
18    $mainContextDate = new DateTime();
19    echo "メインコンテキストの現在時刻: " . $mainContextDate->format('Y-m-d H:i:s.v') . "\n";
20
21    // 新しいファイバーを定義します。
22    // ファイバーは、途中で実行を一時停止・再開できるコルーチンの一種です。
23    $fiber = new Fiber(function (): void {
24        echo "\n--- ファイバーコンテキストから開始 ---\n";
25
26        // ファイバー内で現在の日付と時刻を取得
27        $fiberContextDate = new DateTime();
28        echo "ファイバーコンテキストの現在時刻: " . $fiberContextDate->format('Y-m-d H:i:s.v') . "\n";
29
30        // Fiber::getCurrent() を使用して、現在実行中のFiberインスタンスを取得します。
31        // このメソッドは、ファイバーの内部で呼び出された場合、そのファイバー自身を返します。
32        // メインコンテキストで呼び出された場合はnullを返します。
33        $currentFiber = Fiber::getCurrent();
34
35        // 取得したFiberインスタンスが存在し、Fiber型であることを確認
36        if ($currentFiber instanceof Fiber) {
37            echo "Fiber::getCurrent() で取得したインスタンスID: " . spl_object_id($currentFiber) . "\n";
38            // ここで$currentFiberが、上の$fiber変数と同一のオブジェクトであることを示しています。
39        } else {
40            echo "Fiber::getCurrent() は現在のファイバーを返しませんでした。\n";
41        }
42
43        echo "--- ファイバーコンテキストから終了 ---\n";
44    });
45
46    // 定義したファイバーの実行を開始します。
47    $fiber->start();
48
49    echo "\n--- メインコンテキストに戻る ---\n";
50    // ファイバーが完了し、メインコンテキストに戻ったことを示します。
51    $mainContextDateAfterFiber = new DateTime();
52    echo "ファイバー実行後のメインコンテキスト時刻: " . $mainContextDateAfterFiber->format('Y-m-d H:i:s.v') . "\n";
53    echo "--- メインコンテキストから終了 ---\n";
54}
55
56// サンプル関数を実行します。
57demonstrateFiberAndCurrentDate();

このサンプルコードは、PHP 8.1で導入された、途中で実行を一時停止・再開できるコルーチンの一種である「ファイバー」を使用し、現在の日付と時刻の取得方法、そして現在実行中のファイバーインスタンスを特定する方法を示しています。キーワード「php getcurrentdate」に応じ、DateTimeクラスで現在の時刻を取得しています。

特にFiber::getCurrent()メソッドに注目してください。このメソッドは引数を取らず、戻り値として?Fiberを返します。これは、メソッドがファイバーのコンテキスト内から呼び出された場合はそのファイバー自身(Fiberオブジェクト)を返し、ファイバーのコンテキスト外(例えばメインプログラムの実行中)で呼び出された場合はnullを返すことを意味します。

サンプルコードでは、まずメインコンテキストで時刻を取得し、次に新しいファイバーを作成して実行を開始します。ファイバーの内部では、再度時刻を取得し、その後にFiber::getCurrent()を呼び出して、現在実行中のファイバーインスタンスが自身であることをプログラム的に確認しています。この機能により、ファイバーがどのコンテキストで動作しているかをプログラムから把握することができ、複雑な非同期処理における現在の実行状況を特定する際に役立ちます。

このコードはPHP 8.1以降でファイバー機能が利用できる環境で動作します。Fiber::getCurrent()は、ファイバーの内部で実行された場合に限り、そのFiberインスタンスを返します。ファイバー外部のメインコンテキストで呼び出すとnullが返されるため、戻り値がnullでないか、またFiberインスタンスであるかをif ($currentFiber instanceof Fiber)のように必ず確認してください。このメソッドは、現在の日付時刻を取得するものではなく、実行中のファイバーコンテキストを特定し、プログラムの並行処理を安全に制御するために使われます。バージョン要件と戻り値の確認は特に重要です。

Fiber::getCurrent() で実行中のFiberを取得する

1<?php
2
3/**
4 * 現在実行中の Fiber インスタンスを取得するサンプルコード
5 */
6
7try {
8    // Fiber を作成
9    $fiber = new Fiber(function (): void {
10        // Fiber 内部で現在の Fiber インスタンスを取得
11        $currentFiber = Fiber::getCurrent();
12
13        // Fiber が実行中であれば Fiber インスタンスが返る
14        if ($currentFiber instanceof Fiber) {
15            echo "Fiber is running.\n";
16            // 中断して値を返す
17            Fiber::suspend("Fiber suspended!");
18        } else {
19            echo "Fiber is not running.\n";
20        }
21    });
22
23    // Fiber を開始
24    $result = $fiber->start();
25    echo "Result from Fiber: " . $result . "\n";
26
27
28    // Fiber の外部で getCurrent を呼び出す
29    $outsideFiber = Fiber::getCurrent();
30
31    // Fiber が実行されていないコンテキストでは null が返る
32    if ($outsideFiber === null) {
33        echo "Fiber is not running outside Fiber context.\n";
34    }
35} catch (Throwable $e) {
36    echo "Exception: " . $e->getMessage() . "\n";
37}

このサンプルコードは、PHP 8 の Fiber クラスにおける getCurrent メソッドの使い方を示しています。Fiber::getCurrent() は、現在実行中の Fiber インスタンスを返します。Fiber の内部で呼び出された場合は、その Fiber インスタンス自身が返されます。一方、Fiber の外部(通常のPHPスクリプト実行コンテキスト)で呼び出された場合は、null が返されます。

サンプルコードでは、まず新しい Fiber インスタンスを作成し、その中で Fiber::getCurrent() を呼び出しています。Fiber が実行中であるため、$currentFiber には Fiber インスタンスが格納され、メッセージが表示されます。その後、Fiber::suspend() によって Fiber の実行を中断し、値を返します。

Fiber の外部では、再度 Fiber::getCurrent() を呼び出しています。ここでは Fiber が実行されていないコンテキストであるため、$outsideFiber には null が格納され、その旨のメッセージが表示されます。

getCurrent メソッドは引数を取りません。戻り値は、Fiber インスタンスまたは null です。Fiber が実行中の場合は Fiber インスタンス、それ以外の場合は null が返されます。このメソッドを使うことで、Fiber 内部で現在の Fiber インスタンスを参照したり、Fiber が実行されているかどうかを判断したりすることができます。エラーハンドリングのため、try-catch ブロックで全体を囲んでいます。

Fiber::getCurrent()は、現在実行中のFiberインスタンスを取得します。Fiberの外部で呼び出した場合、nullが返る点に注意が必要です。Fiber内部でのみ有効な関数であることを覚えておきましょう。

サンプルコードでは、Fiber内部と外部の両方でFiber::getCurrent()を呼び出し、その結果を確認しています。Fiberが実行されていないコンテキストではnullが返ることを確認できます。

また、Fiberの実行中に例外が発生する可能性があるため、try-catchブロックで囲み、例外処理を行うようにしましょう。予期せぬエラーが発生した場合でも、プログラムが停止するのを防ぐことができます。Throwableをキャッチすることで、あらゆる例外に対応できます。

関連コンテンツ