PHP 8.1 で Fibers が導入されたとき、多くの開発者は、これがシングルスレッドの同期言語としての PHP の長年の制限に対する解決策になるのではないかと疑問に思いました。 Fibers は、イベント ループを備えた JavaScript や Node.js のように、PHP を非同期にできるでしょうか?答えは微妙です。ファイバーは真の非同期実行を提供しませんが、タスクをより効率的に管理するための強力なツールです。この概念を詳しく見てみましょう。
ファイバーは、PHP で協調的なマルチタスクを実装するためのメカニズムです。これらを使用すると、PHP プロセス全体をブロックすることなく、コードの特定の部分を一時停止したり再開したりできます。 Fiber は、制御をメイン プログラムに「譲り」、要求されたときに中断したところから実行を続行できる特殊な関数と考えてください。
Fiber::suspend() を使用してファイバーが一時停止されると、制御はメインの PHP スクリプトに戻ります。これは次のことを意味します:
例:
$fiber = new Fiber(function () { echo "Fiber started\n"; Fiber::suspend(); echo "Fiber resumed\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "After Fiber Start\n"; $fiber->resume(); echo "After Fiber Resume\n"; Output:
Before Fiber Fiber started After Fiber Start Fiber resumed After Fiber Resume
何が起こっているかは次のとおりです:
はい、ただし一時的なものです。 Fiber::resume() を呼び出すと、Fiber はメインの PHP プロセス内で同期して実行されます。この間:
$fiber = new Fiber(function () { echo "Processing Fiber...\n"; sleep(2); // Simulates a blocking task echo "Fiber Done\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "Between Fiber Start and Resume\n"; $fiber->resume(); echo "After Fiber\n"; Output:
Before Fiber Processing Fiber... Fiber Done Between Fiber Start and Resume After Fiber
ここでは、ファイバーは sleep(2) 呼び出し中にメインプロセスをブロックします。したがって、Fiber はコードを構造化して効率を高める方法を提供しますが、魔法のように並列実行や真の非同期実行を可能にするわけではありません。
「ノンブロッキング」という用語は、ファイバーが並列実行ではなく、より優れたタスク管理を可能にする方法を指します。ファイバーは、一時停止中にメインプロセスをブロックしません。代わりに、制御はメイン スクリプトまたはイベント ループに戻されます。
これは、ReactPHP や Amp などのイベント駆動型アーキテクチャを使用するライブラリまたはフレームワークで特に役立ちます。
あなたが複数の料理を準備するシェフであると想像してください:
あなたは料理を作り始めますが、何かが沸騰するのを待つために一時停止します。
待っている間、あなたは別の料理を準備し始めます。
最初の料理の準備ができたら、そこに戻って調理を続けます。
同様に、Fibers を使用すると、PHP でタスクを「一時停止」し、プロセス全体を保留することなく後でタスクに戻ることができます。
スレッドやイベント ループを使用してタスクを並列実行できる JavaScript や Node.js の非同期プログラミングとは異なり、Fibers では次のことが可能です。
言い換えると:
ファイバーは並列処理を導入しません (タスクは一度に 1 つずつ実行されます)。
これらは、ノンブロッキング コードをより効率的に管理および構築するためのツールです。
PHP ファイバーは PHP を真の非同期にするわけではありませんが、言語への強力な追加機能です。
以上がPHPファイバーとは何ですか? PHP Fiber は本当に非同期実行を可能にしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。