PHPのLaravelフレームワークにおけるメッセージキューと非同期キューの利用方法の解析

不言
リリース: 2023-03-31 21:40:02
オリジナル
2887 人が閲覧しました

この記事では、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
ログイン後にコピー

2. プロジェクトを作成します。

laravel new guagua
ログイン後にコピー

3. Redis とキューを構成します。

4. コントローラーを作成します。

php artisan make:controller DefaultController
ログイン後にコピー

コントローラーのアクションで 100 個のキュー タスクをプッシュします。 。

for($i = 0; $i < 100; $i ++) {
  Queue::push(new SendEmail("ssss".$i));
}
ログイン後にコピー

5. キューを作成するコマンド

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();
}
ログイン後にコピー

6. ルートを変更します

Route::get(&#39;/&#39;, [
  &#39;as&#39; => &#39;index&#39;,
  &#39;uses&#39; => &#39;DefaultController@index&#39;
]);
ログイン後にコピー

7. 監視キュー

php artisan queue:listen
ログイン後にコピー
ログイン後にコピー

Toマルチタスクを確認するには、3 つのウィンドウを同時に開き、同じコマンドを実行します。

8. laravel の組み込みサーバーを使用してサービスを開始します

php artisan serve --port 8080
ログイン後にコピー

ブラウザを開いて http: // ローカルホスト:8080/ページ。もちろんnginxやApacheなども使えます。ただし、さまざまな設定が必要であり、組み込みのものが使いやすいです。

以下に示すように、コンソールで各キューの実行ステータスを確認できます。 100 個のタスクが 3 つのジョブに均等に分割されていることがわかります。


2016321142239283.png (862×658)#この時点で、ほぼ望み通りの効果が得られました。 laravelでは簡単にキューを実装でき、マルチタスクも扱えることが確認できました。

make コマンドで生成されたコードで App\Commands\Command を使用しますが、実行時にそのようなファイルが存在しないというメッセージが表示されます。解決策は、Illuminate\Console\Command を使用するように変更することです。なぜこの低レベルの問題が発生するのか、私の Mac システムに問題があるのか​​、それとも私の性格に問題があるのか​​わかりません。

コントローラーのアクションでキューをプッシュする場合、非同期実行は行われず、アクション スクリプト内で実行されます。これは構成の問題であることが判明しました。構成内の queue.php を変更する必要があるだけでなく、.evn 内の関連する構成も変更する必要があることが判明しました。問題は解決しましたが、まだ金玉に痛みがあり、理解できません。まだlaravelを学ぶ必要があります。


非同期キューの使用方法


1. 構成

キューの定義については説明しません。ここ。 。非同期キューを使用するには 2 つの鍵があります:

(1)存储队列的地方
(2)执行任务的服务
打开 config/queue.php ,这是Laravel5关于队列的配置文件。首先我们可以通过 default 参数指定默认队列驱动,默认配置是 sync , 这是同步队列,我们要做异步队列首先就要改变这里。假设我们用 database 作为驱动,队列任务将会存放在数据库中,而我们后面会另外启动一个后台服务来处理队列任务,这就是异步方式了。

&#39;default&#39; => &#39;database&#39;
ログイン後にコピー

修改完配置后,我们需要创建一个表来存放队列任务,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中文网!

相关推荐:

如何解决Laravel中log无法写入的问题

关于PHP的autoLoad自动加载机制的分析

以上がPHPのLaravelフレームワークにおけるメッセージキューと非同期キューの利用方法の解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!