PHP プログラミングでは、ネットワーク要求の実行、ファイルの読み取りと書き込みなど、時間のかかる操作を実行する必要がある場合があります。従来の同期が使用されている場合、プログラムは操作が完了して結果が返されるまで待機します。これにより、プログラムは待機中に他のことができなくなり、プログラムの効率が低下します。
非同期メソッドを使用すると、操作が完了するまでプログラムに他のタスクの実行を継続させることができます。簡単に言うと、操作の戻り結果を待たずに他のコードを直接実行し、操作の完了後に戻って戻り結果の処理を行うことを意味します。このアプローチにより、プログラムの効率と同時実行性が大幅に向上します。
PHP では、非同期モードは通常、マルチプロセスまたはマルチスレッドを使用して実装されます。ただし、この方法は複雑でエラーが発生しやすいため、通常はサードパーティのライブラリまたは拡張機能を使用する必要があります。 PHP 7.2 以降、新しい非同期プログラミング フレームワークである Swoole が導入されました。これは、非同期プログラミング ソリューションの完全なセットを提供し、PHP ネイティブ コードおよびサードパーティ ライブラリと適切に使用できます。
Swoole は、コルーチン、非同期ノンブロッキング IO、非同期マルチプロセスなど、さまざまな非同期プログラミング手法を提供します。最も一般的に使用される方法はコルーチンです。コルーチンは単一スレッド内で非同期プログラミングを実装でき、軽量で効率が高いという利点があります。
以下では、簡単な例を使用して、Swoole を使用して PHP の非同期実行を実装する方法を紹介します。
まず、Swoole 拡張機能をインストールする必要があります。次のコマンドを使用してインストールできます:
pecl install swoole
インストールが完了したら、次の設定を php.ini ファイルに追加する必要があります:
extension=swoole
次に、見てみましょう。簡単な例。 5 秒間スリープしてから現在時刻に戻るという、非常に時間のかかる操作を実行する必要があります。従来の同期モードでは、この操作に 5 秒かかります。 Swoole を使用した非同期モードでは、この操作を Swoole の非同期タスク プールに送信し、すぐに返すことができます。操作が完了すると、Swoole は指定したコールバック関数を自動的に呼び出し、操作結果を返します。
<?php /* 创建Swoole的异步任务池 */ $pool = new Swoole\Process\Pool(4); /* 添加异步任务 */ $pool->on("WorkerStart", function($pool, $workerId) { /* 启动5个不同的异步任务 */ for ($i = 0; $i < 5; $i++) { /* 异步执行一个耗时5秒的任务 */ $pool->add(function() { sleep(5); return date("Y-m-d H:i:s"); }); } }); /* 处理异步任务完成的回调函数 */ $pool->on("WorkerStop", function($pool, $workerId) { /* 获取执行结果,并输出到控制台 */ $results = $pool->getResults(); foreach ($results as $result) { echo "{$result}\n"; } }); $pool->start();
上記のコードでは、4 つのサブプロセスを含む非同期タスク プールを作成します。次に、WorkerStart イベント コールバック関数で、5 つの異なる非同期タスクを送信し、タスク完了後のコールバック関数として匿名コールバック関数を指定しました。このコールバック関数は結果オブジェクトのリストを受け取り、各結果オブジェクトの値をコンソールに出力します。
最後に、Swoole の start メソッドを呼び出して、非同期タスク プールを開始します。すべての非同期タスクが完了すると、Swoole は指定したコールバック関数を自動的に呼び出し、操作結果を返します。実行結果は次のとおりです。
2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18
要約すると、Swoole の非同期プログラミング手法を使用すると、PHP プログラムの効率と同時実行性を大幅に向上させることができます。 Swoole を使用して非同期プログラムを作成すると、基盤となる実装の詳細にあまり注意を払わずに、ビジネス ロジックの処理に集中できるようになります。
以上が戻りを待たずに PHP を非同期で実行し、コードを直接実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。