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

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

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

作成日: 更新日:

基本的な使い方

startメソッドは、ファイバーの実行を開始するメソッドです。このメソッドを呼び出すと、PHPは現在の実行コンテキストを中断し、Fiberクラスのコンストラクタで指定されたコールバック関数の実行に切り替えます。このとき、startメソッドに渡された引数は、そのままコールバック関数へ引数として渡されます。ファイバーが実行を開始した後、その内部でFiber::suspend()が呼び出されて処理が中断されると、suspend()に渡された値がstartメソッドの戻り値となります。もしファイバーが中断されずに最後まで実行されて正常に終了した場合は、コールバック関数の戻り値がstartメソッドの戻り値として返されます。注意点として、すでに実行中または終了済みのファイバーに対してこのメソッドを呼び出すことはできず、試みた場合はFiberError例外が発生します。このメソッドは、ノンブロッキングな処理や協調的マルチタスキング(コルーチン)を実現するための最初のステップとなります。

構文(syntax)

1// Fiberのインスタンスを作成し、実行する処理 (クロージャ) を渡します。
2$fiber = new Fiber(function(string $message): void {
3    echo "Fiber was started with the message: " . $message;
4});
5
6// start() メソッドを呼び出して Fiber の実行を開始します。
7// start() に渡した引数は、上記クロージャの引数 ($message) として渡されます。
8$fiber->start('Hello, World!');

引数(parameters)

mixed ...$args

  • ...$args: Fiber::start()に渡す任意の引数

戻り値(return)

mixed

Fiber::start() メソッドは、Fiber の実行を開始し、Fiber 内で yield された値、または Fiber の実行が完了した際に返された値を返します。

サンプルコード

PHP Fiber start でセッションを操作する

1<?php
2
3/**
4 * PHPのFiber::startメソッドのサンプルコード。
5 * キーワード「php start session」に関連付け、
6 * セッションを開始し、そのセッションデータをFiber内で参照する例を示します。
7 * FiberはPHP 8.1で導入された機能です。
8 */
9
10// セッションを開始します。
11// これは通常、リクエストの早い段階で呼び出されます。
12session_start();
13
14// セッション変数に値を設定します。
15$_SESSION['user_id'] = 456;
16$_SESSION['username'] = 'BeginnerSE';
17
18echo "メインコンテキスト: セッションID = " . session_id() . "\n";
19echo "メインコンテキスト: ユーザー名 (セッションから) = " . ($_SESSION['username'] ?? 'N/A') . "\n\n";
20
21// Fiber::start()を使用して新しいFiber(コルーチン)を開始します。
22// 第一引数は実行するコールバック関数、それ以降はコールバック関数に渡す引数です。
23$fiberResult = Fiber::start(function (string $taskName) {
24    echo "Fiberコンテキスト: " . $taskName . "を開始します。\n";
25
26    // Fiber内からセッションデータにアクセスできます。
27    // Fiberはメインコンテキストと同じスーパーグローバル($_SESSIONなど)を共有します。
28    echo "Fiberコンテキスト: セッションID = " . session_id() . "\n";
29    echo "Fiberコンテキスト: ユーザーID (セッションから) = " . ($_SESSION['user_id'] ?? 'N/A') . "\n";
30    echo "Fiberコンテキスト: ユーザー名 (セッションから) = " . ($_SESSION['username'] ?? 'N/A') . "\n";
31
32    // 必要であれば、Fiber内でセッション変数を更新することも可能です。
33    // $_SESSION['fiber_processed'] = true;
34
35    // Fiberの処理が完了し、値を返します。
36    return "Fiberの処理が完了しました。";
37}, "セッションデータ処理"); // コールバック関数に渡す引数
38
39// Fiber::start()メソッドは、Fiberのコールバック関数が最終的に返した値を返します。
40echo "\nメインコンテキスト: Fiberの実行結果 = " . $fiberResult . "\n";
41
42// セッションの終了(任意)
43// session_destroy();
44?>

このPHPサンプルコードは、PHP 8.1で導入された並行処理機能であるFiber(ファイバー)のstartメソッドの使用方法と、セッションデータの共有について説明します。

Fiber::startメソッドは、新しいFiber(コルーチン)を作成し、実行を開始するための静的メソッドです。第一引数には実行したい関数(コールバック)を指定し、それ以降の...$argsにはコールバック関数に渡したい任意の引数を指定します。このメソッドの戻り値はmixed型で、Fiber内で実行されたコールバック関数が最終的に返した値が返されます。

サンプルコードではまず、session_start()でPHPセッションを開始し、$_SESSIONスーパーグローバル変数にデータを設定しています。その後、Fiber::startを使って新しいFiberを起動し、そのFiber内でセッションデータがどのように扱われるかを示しています。Fiberコンテキスト内でもメインコンテキストで設定された$_SESSIONデータにアクセスできることが確認でき、セッションIDや設定されたユーザー情報が正常に参照されます。これは、Fiberがメインコンテキストとスーパーグローバル変数を共有していることを意味します。Fiber::startは、Fiber内で実行されたコールバック関数が最終的に返した値を結果として受け取ります。

このコードはPHP 8.1以降のFiber機能を利用しており、それ以前のバージョンでは動作しません。Fiber::start()で起動されるFiberは、メインコンテキストと$_SESSIONなどのスーパーグローバル変数を共有します。そのため、Fiber内でセッションデータを変更すると、メインコンテキストにもその変更が反映されます。複数の処理がセッションデータにアクセスする場合、データの整合性に注意し、意図しない上書きが発生しないよう適切に設計してください。session_start()は通常、リクエストの早い段階で一度だけ呼び出しますので、Fiber内で再度呼び出す必要はありません。このサンプルはFiberが中断せずに最後まで実行されるシンプルなケースです。

PHP Fiberでstr_starts_withを試す

1<?php
2
3/**
4 * Fiber内で文字列が特定のプレフィックスで始まるかを確認する処理を実行します。
5 *
6 * この関数はPHP 8.1で導入されたFiber(ファイバー)の基本的な使い方と、
7 * PHP 8.0で導入されたstr_starts_with関数を組み合わせて、
8 * システムエンジニアを目指す初心者が理解しやすいように構成されています。
9 *
10 * @param string $text チェックする元の文字列。
11 * @param string $prefix 検索するプレフィックス(接頭辞)。
12 * @return string ファイバーの実行結果として返されるメッセージ。
13 */
14function checkStringStartsWithInFiber(string $text, string $prefix): string
15{
16    // Fiberインスタンスを作成します。
17    // Fiberは、実行を一時停止し、後で再開できる軽量な並行処理の仕組みです。
18    // ここでは、特定の処理(文字列チェック)をファイバー内で実行します。
19    $fiber = new Fiber(function (string $fiberText, string $fiberPrefix): string {
20        // ファイバー内で処理を開始したことを示します。
21        echo "ファイバー: 処理を開始します。元の文字列: '{$fiberText}', プレフィックス: '{$fiberPrefix}'\n";
22
23        // str_starts_with関数は、文字列が特定のプレフィックスで始まるかを効率的にチェックします。
24        // PHP 8.0以降で利用可能です。
25        if (str_starts_with($fiberText, $fiberPrefix)) {
26            $result = "ファイバー: はい、'{$fiberText}' は '{$fiberPrefix}' で始まります。";
27        } else {
28            $result = "ファイバー: いいえ、'{$fiberText}' は '{$fiberPrefix}' で始まりません。";
29        }
30
31        // ファイバー内で処理を完了したことを示します。
32        echo "ファイバー: 処理を完了します。\n";
33
34        // ファイバーの実行結果を返します。この値はFiber::start()の戻り値となります。
35        return $result;
36    });
37
38    // Fiber::start()メソッドを呼び出して、ファイバーの実行を開始します。
39    // ここで渡した引数($text, $prefix)は、Fiberのコールバック関数
40    // (上記の anonymous function) の引数 ($fiberText, $fiberPrefix) として渡されます。
41    // ファイバーが処理を完了すると、その戻り値がFiber::start()から返されます。
42    $fiberResult = $fiber->start($text, $prefix);
43
44    // メインスクリプトでファイバーの実行結果を受け取ったことを示します。
45    echo "メイン: ファイバーから結果を受け取りました。\n";
46
47    // ファイバーから受け取った最終結果を返します。
48    return $fiberResult;
49}
50
51// --- サンプル実行 ---
52
53echo "--- 実行例 1: 文字列がプレフィックスで始まる場合 ---\n";
54$output1 = checkStringStartsWithInFiber("HelloWorld", "Hello");
55echo "最終結果: " . $output1 . "\n\n";
56
57echo "--- 実行例 2: 文字列がプレフィックスで始まらない場合 ---\n";
58$output2 = checkStringStartsWithInFiber("OpenSource", "Proprietary");
59echo "最終結果: " . $output2 . "\n\n";
60
61echo "--- 実行例 3: 大文字・小文字を区別する場合 (str_starts_withの特性) ---\n";
62$output3 = checkStringStartsWithInFiber("php", "PHP");
63echo "最終結果: " . $output3 . "\n\n";

このサンプルコードは、PHP 8.1で導入されたFiber(ファイバー)の基本的な利用方法と、PHP 8.0で導入されたstr_starts_with関数を組み合わせて、文字列が特定のプレフィックスで始まるかを確認する処理を示しています。

Fiberは、実行を一時停止し、後で再開できる軽量な並行処理の仕組みです。まず、実行したい処理を無名関数として指定し、new Fiber()Fiberインスタンスを作成します。

Fiber::start(mixed ...$args)メソッドは、このFiberインスタンスの実行を開始します。引数...$argsに渡された値は、Fiber作成時に指定した無名関数(コールバック関数)の引数として順に渡されます。サンプルコードでは、チェック対象の文字列$textとプレフィックス$prefixFiber::startに渡され、ファイバー内で利用されます。

ファイバー内の処理では、PHP 8.0以降で利用可能なstr_starts_with()関数を使って、文字列が指定されたプレフィックスで始まるかを効率的にチェックします。この関数は、大文字と小文字を区別して判定します。

ファイバー内の無名関数が処理を完了し、returnで値を返すと、その値がFiber::start()メソッドの戻り値として返されます。これにより、メインスクリプトはファイバーで実行された処理の結果を受け取ることができます。このように、Fiber::startはファイバーの実行開始と結果の取得を担う重要なメソッドです。

Fiber::start()はファイバーの実行を開始し、引数をファイバーのコールバック関数に渡します。引数の順番と型が一致しているか確認してください。str_starts_with()はPHP 8.0から利用可能で、大文字・小文字を区別します。意図しない結果にならないよう注意が必要です。ファイバーは軽量な並行処理の仕組みですが、本格的な並行処理には適していません。複雑な処理には、より高度な並行処理技術を検討しましょう。ファイバーの戻り値はFiber::start()から返されるため、結果の受け取り忘れに注意してください。

PHP Fiber::startで文字列チェックする

1<?php
2
3/**
4 * 指定されたテキストが特定のプレフィックスで始まるかどうかをチェックする関数です。
5 * PHP 8以降で利用可能なstr_starts_with関数を使用しています。
6 *
7 * @param string $text   チェック対象の文字列。
8 * @param string $prefix 始まることを期待するプレフィックス。
9 * @return bool テキストがプレフィックスで始まる場合はtrue、それ以外の場合はfalse。
10 */
11function checkStringStartsWith(string $text, string $prefix): bool
12{
13    return str_starts_with($text, $prefix);
14}
15
16// Fiber::startメソッドの動作を示すサンプルコードです。
17// Fiberは、軽量なコルーチンを実現するためのPHP 8の機能です。
18// Fiber::startは、Fiberオブジェクトが保持するcallable(関数やクロージャ)を実行を開始します。
19// 引数`...$args`は、そのcallableに渡されます。
20// 戻り値`mixed`は、callableがyieldした値、または終了した際の最終的な戻り値です。
21
22// 1. Fiberオブジェクトを作成します。
23// クロージャは、checkStringStartsWith関数を呼び出し、その結果を返します。
24$fiber = new Fiber(function (string $targetString, string $searchPrefix) {
25    // Fiber内で実行される処理
26    // 引数として受け取った文字列とプレフィックスを使って、チェックを実行します。
27    echo "Fiber内での処理: '{$targetString}' が '{$searchPrefix}' で始まるかチェック中... " . PHP_EOL;
28    return checkStringStartsWith($targetString, $searchPrefix);
29});
30
31// 2. Fiber::start()を呼び出してFiberの実行を開始します。
32// ここで渡す引数("Hello, PHP!", "Hello")は、上記のクロージャに渡されます。
33$result1 = $fiber->start("Hello, PHP!", "Hello");
34
35// Fiberの実行結果(クロージャの戻り値)を受け取ります。
36echo "結果1: 'Hello, PHP!' は 'Hello' で始まりますか? " . ($result1 ? 'はい' : 'いいえ') . PHP_EOL . PHP_EOL;
37
38
39// 別のFiberを作成し、異なる文字列で同様のチェックを行います。
40// Fiberは通常一度実行されると終了するため、新しいタスクには新しいFiberを作成するのが一般的です。
41$fiber2 = new Fiber(function (string $targetString, string $searchPrefix) {
42    echo "Fiber内での処理: 'PHP 8 is great' が 'Python' で始まるかチェック中... " . PHP_EOL;
43    return checkStringStartsWith($targetString, $searchPrefix);
44});
45
46// Fiberを開始し、別の引数を渡します。
47$result2 = $fiber2->start("PHP 8 is great", "Python");
48
49echo "結果2: 'PHP 8 is great' は 'Python' で始まりますか? " . ($result2 ? 'はい' : 'いいえ') . PHP_EOL . PHP_EOL;
50
51
52// Fiberが値を直接返す例
53$fiber3 = new Fiber(function (string $targetString, string $searchPrefix) {
54    $starts = checkStringStartsWith($targetString, $searchPrefix);
55    return "最終確認: '{$targetString}' は '{$searchPrefix}' で始まります。結果: " . ($starts ? 'TRUE' : 'FALSE');
56});
57
58$result3 = $fiber3->start("Learning PHP", "Learning");
59echo "結果3: " . $result3 . PHP_EOL;
60
61?>

PHP 8で導入されたFiber::startメソッドは、軽量なコルーチンであるFiberの実行を開始します。Fiberは、途中で実行を中断したり再開したりできる協調的マルチタスクを実現する機能で、非同期処理などをより読みやすい形で記述する際に役立ちます。

このstartメソッドは、Fiberオブジェクトのコンストラクタで指定された関数やクロージャ(callable)の実行を開始します。引数mixed ...$argsは、その実行される関数やクロージャに渡す値を指定します。これにより、Fiber内で利用したいデータを外部から簡単に渡すことが可能です。

メソッドの戻り値mixedは、Fiber内の処理が完了した際にその関数やクロージャが返した値となります。サンプルコードでは、checkStringStartsWith関数をFiber内で実行し、文字列が特定のプレフィックスで始まるかどうかの真偽値を計算しています。そして、Fiber::startを呼び出す際に必要な文字列とプレフィックスの引数を渡し、最終的にその真偽値がstartメソッドの戻り値として受け取られています。このように、Fiber::startを使うことで、別の実行フローで処理を開始し、その結果を柔軟に受け取ることができます。

このサンプルコードは、PHP 8で導入された軽量コルーチン機能であるFiberの基本的な使い方を示しています。Fiber::start()メソッドは、Fiberオブジェクトの作成時に指定した関数やクロージャの実行を開始します。start()に渡される引数...$argsは、その実行される関数へそのまま渡されますので、引数の型と順序を一致させるように注意してください。この例ではyieldを使用していないため、start()を呼び出すとFiber内の処理が完了するまで制御が戻らず、その結果がstart()の戻り値となります。Fiberは一度実行が完了すると通常は再利用できませんので、新たな処理を開始する場合は新しいFiberオブジェクトを作成してください。

関連コンテンツ