ホームページ >バックエンド開発 >PHPチュートリアル >PHP はシングルスレッド言語ですが、Laravel はキュー ジョブをどのように非同期的に処理するのでしょうか?

PHP はシングルスレッド言語ですが、Laravel はキュー ジョブをどのように非同期的に処理するのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-01 07:24:18377ブラウズ

PHP is a Single-Threaded Language, So How Does Laravel Handle Queue Jobs Asynchronously?

PHP はシングルスレッド言語として知られており、単一プロセス内で一度に 1 つのタスクしか実行できません。ただし、Laravel は、複数のタスクを「非同期」で処理するための堅牢なキュー システムを提供します。 PHP がシングルスレッドである場合、Laravel はどのようにしてこの魔法を実現するのでしょうか?簡単に説明しましょう。

PHPプロセスとは何ですか?

キューに入る前に、PHP プロセスとは何かを理解する必要があります。

プロセスは、タスクを完了するために雇われた労働者のようなものです。 PHP スクリプト (php my_script.php など) を実行すると、オペレーティング システムによって新しいプロセスが作成されます。このプロセス:

  • PHP スクリプトをロードします。
  • コードを段階的に実行します。
  • タスクが完了すると停止して「死亡」します。 例えば:
echo "Hello World!";

このスクリプトを実行すると、PHP はプロセスを開始し、「Hello World!」を表示して、プロセスを終了します。

Web アプリケーションにおける PHP

Web アプリケーションの場合:

  • Web サーバー (Apache や Nginx など) はブラウザから HTTP リクエストを受け取ります。
  • サーバーはリクエストを処理するために新しい PHP プロセスを作成します。
  • PHP はリクエストを処理します (データベースからのデータの取得やページのレンダリングなど)。
  • ブラウザに応答を送信した後、プロセスは終了します。
  • PHP プロセスの存続期間は短くなります。一度に 1 つのリクエストを処理してから停止します。この設計により、PHP は Web アプリケーションにとってシンプルかつ効率的になります。

シングルスレッドとは何ですか?

PHP はシングルスレッドです。つまり:

  • PHP プロセスは一度に 1 つのタスクのみを処理できます。
  • 同じプロセス内で複数のタスクを同時に実行することはありません。 例えば:
echo "Task 1";
// Waits for Task 1 to finish before starting Task 2
echo "Task 2";

PHP は最初にタスク 1 を実行します。完了して初めてタスク 2 に移動します。この動作は、タスクが同じプロセス内で並行して実行できる JavaScript などの言語とは異なります。

では、Laravel はキューをどのように処理するのでしょうか?

Laravel のキュー システムを使用すると、メイン アプリケーションをブロックすることなく、バックグラウンドで複数のタスクを実行できます。例:

  • メールを送信しています。
  • 画像のアップロードを処理しています。
  • 通知を送信しています。 これらのタスクはバックグラウンドで実行されるため、メイン アプリケーションはユーザーに迅速に応答できます。

でも、PHP は一度に 1 つのタスクしか処理できませんよね? Laravel はどのようにして非同期のように見えるのでしょうか?答えはワーカーと複数のプロセスにあります。

ワーカーとは何ですか?

Laravel のワーカーは、キュー内のジョブをリッスンして実行する、長時間実行される PHP プロセスです。

コマンドを実行すると:

php artisan queue:work

新しい PHP プロセス (またはワーカー) が開始されます。このプロセス:

  • キュー システム (Redis やデータベースなど) に接続します。
  • 新しいジョブ (タスク) がキューに到着するのを待ちます。
  • ジョブを 1 つずつ取得して処理します。 例: 1,000 通の電子メールを送信するタスクがあると想像してください。 メイン アプリケーションは 1,000 個のジョブをキューに送信します。 ワーカー プロセスは 1 つのジョブを選択し、電子メールを送信し、次のジョブに移動します。

Laravel はどのようにして非同期動作を実現するのでしょうか?

Laravel は、複数のワーカーを同時に実行することで「非同期」動作を実現します。各ワーカーは個別の PHP プロセスです。

その仕組みは次のとおりです:
phpArtisan Queue:work を実行すると、1 つのワーカー (1 つの PHP プロセス) から開始されます。
スーパーバイザーなどのプロセス マネージャーを使用して、複数のワーカーを起動して、ローカルおよび運用環境のさまざまなタブでジョブを並行して処理できます。
これにより、複数の PHP プロセスが開始されます。各ワーカーはジョブを独立して処理するため、タスクが同時に実行されているように見えます。

ジョブがキューに入れられるとどうなりますか?

Laravel でジョブをキューに入れると、次のようなことが段階的に行われます:

  1. ジョブの作成: ジョブ (電子メールの送信など) はシリアル化され (保存可能な形式に変換され)、キュー バックエンド (Redis やデータベースなど) に追加されます。
  2. ワーカーがキューをポーリングします: ワーカーはキューに新しいジョブがないか継続的にチェックします。 仕事が見つかった場合、労働者はそれを受け取ります。
  3. ジョブの実行: ワーカーはジョブを逆シリアル化し、その handle() メソッドを実行します。 完了すると、ジョブは完了としてマークされます。
  4. ジョブの完了: ワーカーはジョブをキューから削除します。

ジョブが失敗した場合、Laravel はジョブを再試行するか、(設定に基づいて) 「失敗したジョブ」リストに移動します。

シナリオ例: 電子メールの送信
ユーザーが問い合わせフォームを送信する Laravel アプリケーションがあると想像してください。フォームが送信されると:

  • メイン アプリケーションはフォームを処理し、すぐにユーザーに応答します。
  • メールをすぐに送信する代わりに、メール送信タスクをキューに追加します。

バックグラウンドで:

  • ワーカーが電子メール送信ジョブを選択します。
  • メールを送信します。
  • 次のジョブに移動します。
  • これにより、ユーザーはメールの送信を待つ必要がなくなり、アプリが高速化されます。

ワーカーは本番環境でどのように実行されますか?

本番環境では、Laravel ワーカーは Supervisor などのツールによって管理されます。スーパーバイザはワーカーを年中無休で実行し続け、クラッシュした場合は再起動します。

スーパーバイザーの構成例:

echo "Hello World!";

コマンド: queue:work コマンドを実行します。
numprocs=5: ジョブを処理するために 5 つのワーカー (5 つの PHP プロセス) を開始します。

本当に非同期なのでしょうか?

技術的には、Laravel キューは、JavaScript や Node.js がタスクを処理する方法とは異なります。代わりに:

各ワーカーは一度に 1 つのジョブを処理します。
複数のワーカー (プロセス) が並列処理を提供し、非同期実行のように見えます。

覚えておくべき重要なポイント

  • PHP はシングルスレッドであるため、単一の PHP プロセスは一度に 1 つのタスクを処理します。
  • Laravel はワーカー (長時間実行される PHP プロセス) を使用してキュージョブを処理します。
  • 複数のワーカーを同時に実行できるため、ジョブを並行して処理できます。
  • キュー バックエンド (Redis など) は、ワーカーがジョブを取得するまでジョブを保存する仲介者として機能します。
  • Supervisor などのツールにより、ワーカーが本番環境で継続的に稼働することが保証されます。

Laravel のキュー システムは、バックグラウンドでタスクを処理する賢い方法であり、アプリケーションのパフォーマンスとユーザー エクスペリエンスを向上させます。 PHP自体はシングルスレッドですが、Laravelは複数のプロセス(ワーカー)を実行することで並列処理を実現します。このシンプルかつ効果的な設計により、PHP の制限がある場合でも、Laravel は重いワークロードを処理できます。

以上がPHP はシングルスレッド言語ですが、Laravel はキュー ジョブをどのように非同期的に処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。