ホームページ >バックエンド開発 >PHPチュートリアル >PHP はシングルスレッド言語ですが、Laravel はキュー ジョブをどのように非同期的に処理するのでしょうか?
PHP はシングルスレッド言語として知られており、単一プロセス内で一度に 1 つのタスクしか実行できません。ただし、Laravel は、複数のタスクを「非同期」で処理するための堅牢なキュー システムを提供します。 PHP がシングルスレッドである場合、Laravel はどのようにしてこの魔法を実現するのでしょうか?簡単に説明しましょう。
キューに入る前に、PHP プロセスとは何かを理解する必要があります。
プロセスは、タスクを完了するために雇われた労働者のようなものです。 PHP スクリプト (php my_script.php など) を実行すると、オペレーティング システムによって新しいプロセスが作成されます。このプロセス:
echo "Hello World!";
このスクリプトを実行すると、PHP はプロセスを開始し、「Hello World!」を表示して、プロセスを終了します。
Web アプリケーションの場合:
PHP はシングルスレッドです。つまり:
echo "Task 1"; // Waits for Task 1 to finish before starting Task 2 echo "Task 2";
PHP は最初にタスク 1 を実行します。完了して初めてタスク 2 に移動します。この動作は、タスクが同じプロセス内で並行して実行できる JavaScript などの言語とは異なります。
Laravel のキュー システムを使用すると、メイン アプリケーションをブロックすることなく、バックグラウンドで複数のタスクを実行できます。例:
でも、PHP は一度に 1 つのタスクしか処理できませんよね? Laravel はどのようにして非同期のように見えるのでしょうか?答えはワーカーと複数のプロセスにあります。
Laravel のワーカーは、キュー内のジョブをリッスンして実行する、長時間実行される PHP プロセスです。
コマンドを実行すると:
php artisan queue:work
新しい PHP プロセス (またはワーカー) が開始されます。このプロセス:
Laravel は、複数のワーカーを同時に実行することで「非同期」動作を実現します。各ワーカーは個別の PHP プロセスです。
その仕組みは次のとおりです:
phpArtisan Queue:work を実行すると、1 つのワーカー (1 つの PHP プロセス) から開始されます。
スーパーバイザーなどのプロセス マネージャーを使用して、複数のワーカーを起動して、ローカルおよび運用環境のさまざまなタブでジョブを並行して処理できます。
これにより、複数の PHP プロセスが開始されます。各ワーカーはジョブを独立して処理するため、タスクが同時に実行されているように見えます。
Laravel でジョブをキューに入れると、次のようなことが段階的に行われます:
ジョブが失敗した場合、Laravel はジョブを再試行するか、(設定に基づいて) 「失敗したジョブ」リストに移動します。
シナリオ例: 電子メールの送信
ユーザーが問い合わせフォームを送信する Laravel アプリケーションがあると想像してください。フォームが送信されると:
バックグラウンドで:
本番環境では、Laravel ワーカーは Supervisor などのツールによって管理されます。スーパーバイザはワーカーを年中無休で実行し続け、クラッシュした場合は再起動します。
スーパーバイザーの構成例:
echo "Hello World!";
コマンド: queue:work コマンドを実行します。
numprocs=5: ジョブを処理するために 5 つのワーカー (5 つの PHP プロセス) を開始します。
技術的には、Laravel キューは、JavaScript や Node.js がタスクを処理する方法とは異なります。代わりに:
各ワーカーは一度に 1 つのジョブを処理します。
複数のワーカー (プロセス) が並列処理を提供し、非同期実行のように見えます。
Laravel のキュー システムは、バックグラウンドでタスクを処理する賢い方法であり、アプリケーションのパフォーマンスとユーザー エクスペリエンスを向上させます。 PHP自体はシングルスレッドですが、Laravelは複数のプロセス(ワーカー)を実行することで並列処理を実現します。このシンプルかつ効果的な設計により、PHP の制限がある場合でも、Laravel は重いワークロードを処理できます。
以上がPHP はシングルスレッド言語ですが、Laravel はキュー ジョブをどのように非同期的に処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。