キュー構成
まず、以前のプロジェクトでキューを使用する方法を説明しましょう。
現在のプロジェクトはすべて symfony を使用し、古いプロジェクトは symfony1.4 を使用し、新しいプロジェクトは symfony2 を使用します。 symfony の全体的な使用感は非常に快適で、特に symfony2 は一般的に Java フレームワークの設計アイデアを多く使用しています。ただし、キューはサポートされていません。 symfony では、キューを使用していくつかのプロセスも実行しました。私は最初に Zhang Yan の httpsqs を使用しました。こちらは使い方はシンプルだけどワンポイント。結局のところ、私たちのプロジェクトはまだ正式に外部にサービスを提供しているため、Apache のオープンソース プロジェクトである ActiveMQ を調査したところ、Apache の下に新しい MQ、それが Apollo があることがわかりました。最終的には Apollo を使用することにしました。
プロジェクトにおけるキューの主なアプリケーション シナリオは、サードパーティ データの同期、サードパーティ データ ユーザーへのデータ変更の同期通知など、時間のかかる機能を非同期で処理することです。私たちの一般的な考え方は、各コントローラーで非同期処理が必要な場合は、json オブジェクトをエンコードして Apollo に詰め込むだけです。別の作業コマンドを作成し、このコマンド内の json オブジェクトを解析し、内部のアクションとパラメーターに基づいてさまざまなメソッドを呼び出します。ビジネス ニーズに応じて、Command をデーモン プロセスとして同時に異なるマシン上で実行することも、非同期マルチタスク アプリケーションを実装するソリューションとして考慮できます。私はlaravelに出会うまでそれを使い続けました。それを研究する計画を立ててください。可能であれば交換することも不可能ではありません。ふふ。
学習を始めたばかりなので、もちろんそのままlaravel5に進みました。ルート、コントローラー、ビューは基本的に symfony と同じなので、始めるのは難しくありません。最後に、キューについて調べます。
1. laravle をインストールし、composer を使用します。これは非常に簡単です。
リーリー~/.composer/vendor/bin を環境変数に追加します。
リーリーlaravelはコマンドラインから直接使用できます。それを試してみてください。
リーリー以下が表示されれば成功です。
リーリー2. プロジェクトを作成します。
リーリー3. Redis とキューを構成します。
4. コントローラーを作成します
リーリーコントローラーのアクションで 100 個のキュータスクをプッシュします。
リーリー5. キューを作成するコマンド
リーリーapp/Commands/SendEmail.php を変更し、プライベート変数を追加します。
リーリーコンストラクターも変更します。
リーリーハンドルメソッドの修正
リーリー6. ルートを変更する
リーリー7. キューを監視する
リーリーマルチタスクを検証するために、3 つのウィンドウを同時に開き、同じコマンドを実行しました。
8.laravelの組み込みサーバーを使用してサービスを開始します
リーリーブラウザを開いて http://localhost:8080/ ページにアクセスします。もちろんnginxやApacheなども使えます。ただし、さまざまな設定が必要であり、組み込みのものが使いやすいです。
以下に示すように、コンソールで各キューの実行ステータスを確認できます。 100 個のタスクが 3 つのジョブに均等に分割されていることがわかります。
この時点で、私は基本的に望んでいた効果を達成しました。 laravelでは簡単にキューを実装でき、マルチタスクも扱えることが確認できました。
use AppCommandsCommand は make コマンドによって生成されたコードで使用されますが、実行時にそのようなファイルが存在しないことを示すメッセージが表示されます。 解決策は、IlluminateConsoleCommand を使用するように変更することです。なぜこの低レベルの問題が発生するのかわかりません。私の Mac システムの問題ですか、それとも私の性格の問題ですか?
コントローラーのアクションでキューをプッシュする場合、非同期実行は行われず、アクションのスクリプト内で実行されます。 これは構成の問題であることが判明しました。構成内の queue.php を変更する必要があるだけでなく、.evn 内の関連する構成も変更する必要があることが判明しました。 問題は解決しましたが、まだ金玉に痛みがあり、理解できません。まだlaravelを学ぶ必要があります。
非同期キューの使い方
1. 構成
キューの定義については、ここでは紹介しません。非同期キューを使用するには 2 つの鍵があります:
(1) キューを保存する場所
(2) タスクを実行するサービス
Laravel5のキュー設定ファイルであるconfig/queue.phpを開きます。まず、デフォルトのパラメータを使用してデフォルトのキュー ドライバを指定できます。デフォルトの設定は同期キューです。非同期キューを作成するには、まずこれを変更する必要があります。ドライバーとしてデータベースを使用すると仮定すると、キュー タスクはデータベースに保存され、後でキュー タスクを処理するために別のバックグラウンド サービスを開始します。これは非同期メソッドです。
設定を変更した後、Laravel5 にはデータ移行を生成するための命令が組み込まれています。もちろん、データベース接続を設定する必要があります。 。
リーリーこれにより、データベースにジョブ テーブルが自動的に作成されます。
2. キューリスニングサービスを開始します
通过下面这条指令启动队列监听服务,它会自动处理 jobs 表中的队列任务:
php artisan queue:listen
在linux中,如果想让它在后台执行,可以这样:
nohup php artisan queue:listen &
3.添加队列任务
关于队列任务的添加,手册里说的比较详细,这里就简单举个例子吧。
首先,通过artisan创建一个队列命令:
php artisan make:command SendEmail --queued
这样会生成 app/Commands/SendEmail.php 这个类文件,这个类会被标识为队列命令,你可以在 handle 方法中写自己的业务逻辑。
在控制器中,可以简单通过 Bus::dispatch 分发任务:
Bus::dispatch(new \App\Commands\SendEmail());
你会发现任务不会立即执行,而是被放到 jobs 表中,由队列监听服务处理。
更详细的用法建议参考 command bus 和 queue 相关的手册章节。