この記事では、PHP の Laravel フレームワークでメッセージ キューと非同期キューを使用する方法を主に紹介します。Laravel 5.0 以降のバージョンでは、サンプル環境は Linux システムです。必要な方は参考にしてください。
キュー構成まず、以前のプロジェクトでキューを使用する方法を説明します。
現在のプロジェクトはすべて 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 global require "laravel/installer=~1.1" vi ~/.bash_profile
~/.composer/vendor/bin を環境変数に追加します。
source ~/.bash_profile
laravel はコマンドラインから直接使用できます。それを試してみてください。
laravel -V
次のように表示されれば成功です。
Laravel Installer version 1.2.1
laravel new guagua
4. コントローラーを作成します。
php artisan make:controller DefaultController
コントローラーのアクションで 100 個のキュー タスクをプッシュします。 。
for($i = 0; $i < 100; $i ++) { Queue::push(new SendEmail("ssss".$i)); }
php artisan make:command SendEmail --queued
app/Commands/SendEmail.php を変更し、プライベート変数を追加します。
protected $msg;
コンストラクターも変更します。
public function __construct($msg) { $this->msg = $msg; }
変更されたハンドル メソッド
public function handle() { sleep(4); echo $this->msg."\t".date("Y-m-d H:i:s")."\n"; $this->delete(); }
Route::get('/', [ 'as' => 'index', 'uses' => 'DefaultController@index' ]);
php artisan queue:listen
Toマルチタスクを確認するには、3 つのウィンドウを同時に開き、同じコマンドを実行します。
8. laravel の組み込みサーバーを使用してサービスを開始しますphp artisan serve --port 8080
ブラウザを開いて http: // ローカルホスト:8080/ページ。もちろんnginxやApacheなども使えます。ただし、さまざまな設定が必要であり、組み込みのものが使いやすいです。
以下に示すように、コンソールで各キューの実行ステータスを確認できます。 100 個のタスクが 3 つのジョブに均等に分割されていることがわかります。
#この時点で、ほぼ望み通りの効果が得られました。 laravelでは簡単にキューを実装でき、マルチタスクも扱えることが確認できました。
make コマンドで生成されたコードで App\Commands\Command を使用しますが、実行時にそのようなファイルが存在しないというメッセージが表示されます。解決策は、Illuminate\Console\Command を使用するように変更することです。なぜこの低レベルの問題が発生するのか、私の Mac システムに問題があるのか、それとも私の性格に問題があるのかわかりません。
コントローラーのアクションでキューをプッシュする場合、非同期実行は行われず、アクション スクリプト内で実行されます。これは構成の問題であることが判明しました。構成内の queue.php を変更する必要があるだけでなく、.evn 内の関連する構成も変更する必要があることが判明しました。問題は解決しましたが、まだ金玉に痛みがあり、理解できません。まだlaravelを学ぶ必要があります。キューの定義については説明しません。ここ。 。非同期キューを使用するには 2 つの鍵があります:
(1)存储队列的地方
(2)执行任务的服务
打开 config/queue.php ,这是Laravel5关于队列的配置文件。首先我们可以通过 default 参数指定默认队列驱动,默认配置是 sync , 这是同步队列,我们要做异步队列首先就要改变这里。假设我们用 database 作为驱动,队列任务将会存放在数据库中,而我们后面会另外启动一个后台服务来处理队列任务,这就是异步方式了。
'default' => 'database'
修改完配置后,我们需要创建一个表来存放队列任务,Laravel5已经在自带artisan命令中内置了一个指令用来生成数据迁移,只需要两条命令即可,当然你得实现配置好数据库连接。
php artisan queue:table php artisan migrate
这样就自动在数据库中创建了 jobs 表。
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 表中,由队列监听服务处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がPHPのLaravelフレームワークにおけるメッセージキューと非同期キューの利用方法の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。