Laravelキューの使用

4843 ワード

1環境
LaravelはThinkPHPのようなphpフレームワークで、パッケージされた多くの機能が便利に使用できます.キューQueueはその1つです.Windows環境では、Laravelの統合開発環境IDEとしてPHPstormを使用できます.
2キュー
Laravelは、sync、database、beanstalkd、sqs、redis、null(app/config/queue.phpを参照)など、さまざまなキュードライバを構成できます.syncは同期であり、databaseはデータベースを使用し、次の3つはサードパーティのキュー・サービスであり、最後の1つはキューを使用しません.通過するEnvのQUEUE_CONNECTIONオプションで、どのドライブを選択するかを決定します.QUEUE_CONNECTION=databaseは、データベースドライバキューを選択します.
3原理
キューとは、データの生産者と消費者の区別があります.生産者はキューにデータを配達し,消費者はキューからデータを取得する.例えば、ユーザーにメールを送信するシーン:今10 wのメールを送信する必要があります.最も簡単なのは、メールの受信者、内容などを10 wのタスクに分割してキューに置く方法と、各タスクを処理するコールバック方法を設定する必要があります.キューにメール送信タスクがある場合、キューはコールバックメソッドをアクティブに呼び出し、タスクの詳細を渡します.コールバックメソッドの処理が完了すると、単一のメールが送信されます.その他のメールは見本どおりに処理します.
4データベース駆動キューの使用
4.1製造オーダー表の生成
端末での入力
php artisan queue:table
php artisan migrate

データベース接続が正常な場合、jobsテーブルがデータベースに表示されます.
  [id] bigint  
  [queue] nvarchar(255) 
  [payload] nvarchar(max) 
  [attempts] tinyint 
  [reserved_at] int  
  [available_at] int  
  [created_at] int  

4.2タスククラスの作成
php artisan make:job SendEmail

端末内で上記コマンドを実行すると、app/Jobs/SendMailが自動的に生成する.phpファイル
class SendMail implements ShouldQueue

このファイルのhandleメソッドでは、タスク処理ロジックを配置できます.
4.3タスクの送信
任意の場所でdispatch送信タスクを次のように呼び出すことができます.
SendMail::dispatch($email);

4.4駆動キュー
上記の手順を完了すると、データベースにレコード(insert SQL文としてエクスポート)が見つかります.
INSERT INTO [jobs]([id], [queue], [payload], [attempts], [reserved_at], [available_at], [created_at]) VALUES (6, N'default', N'{"displayName":"App\\Jobs\\ProcessPodcast","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"timeout":null,"timeoutAt":null,"data":{"commandName":"App\\Jobs\\ProcessPodcast","command":"O:23:\"App\\Jobs\\ProcessPodcast\":8:{s:29:\"\u0000App\\Jobs\\ProcessPodcast\u0000data\";s:6:\"111222\";s:6:\"\u0000*\u0000job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:7:\"chained\";a:0:{}}"}}', 0, NULL, 1545980176, 1545980176);

タスクはデータベース内に配置され、キューを実行してから、キューがコールバックメソッドをアクティブに呼び出すことができます.
php artisan queue:work

端末内で上記コマンドを実行すればよい.このコマンドにはdeamon、triesなど多くのパラメータがあり、必要に応じて指定できます.
4.5デーモンプロセス
アプリケーション・サービスの安定性を確保するためには、デーモン・プロセスを開始する必要があります.LinuxではSupervisor、WindowsではForeverが一般的ですが、ここを参考にしてください.
4.6失敗した処理の実行
失敗したタスクを処理する場合、Laravelも提供するソリューションです.次のコマンドを実行すると、失敗したタスクを記録するテーブルを作成できます.
php artisan queue:failed-table
php artisan migrate

データベースでfailed_を生成jobs :
  [id] bigint
  [connection] nvarchar(max)
  [queue] nvarchar(max) 
  [payload] nvarchar(max) 
  [exception] nvarchar(max) 
  [failed_at] datetime

タスクに失敗したExceptionは、SendMailのfailedメソッドに渡されるため、SendMailで独自にメソッドを実装し、さらに処理する必要があります.タスクの実行に失敗した原因は、パラメータエラー、試行回数が制限を超えた、タイムアウト、handleメソッドで例外が投げ出されたなど、多くの場合、失敗したタスクとして処理されます.
4.7タスク実行前後の処理
Laravelは、App/Providers/AppServiceProviderのboot()に次のコードを追加するタスク実行前後の処理エントリを提供します.
public function boot()
{
      Queue::before( function (JobProcessing $event) {
          Log::info("     ");
      });
      Queue::after( function (JobProcessed $event) {
          Log::info("     ");
      });
}

渡された$eventには、タスクの詳細、いくつかの簡単な例があります.
$event->connectionName
$event->job
$event->job->payload()

5 Redisドライバキューの使用
5.1 LaravelインストールPredisパッケージ
LaravelでRedisを使用する前に、Composerでpredis/predisパッケージをインストールする必要があります.
composer require predis/predis

上記の拡張はLaravelがRedisと付き合うのを助けるもので、私たちはまだRedisサービスが不足しています.この時点で.EnvのQUEUE_CONNECTIONはredisに変更され、アクセス時にエラーが表示されます.
Predis \ Connection \ ConnectionException (10061)
����Ŀ����������ܾ����޷����ӡ� [tcp://127.0.0.1:6379]

5.2 Redisサービスの構成
Redis公式サイトでソースコードをダウンロードしてから、自分でコンパイルすればいいです.公式にはWindows版は提供されていません.RedisのWindows版はマイクロソフトのワークグループによって維持されています.GitHubページから見つけることができます.しかし、メンテナンスは行われていないようで、最新バージョンは16年にリリースされた3.2.100です.Linuxでは簡単な運転で
./redis-server

サービスを開始し、
./redis-cli

を使用してRedisを試します.使用も簡単です.set key valueとget keyです.Windowsでインストール後、コマンドラインでインストールディレクトリにcd
C:\Program Files\Redis>redis-server redis.windows.conf
C:\Program Files\Redis>netstat -an|find "6379"
  TCP    127.0.0.1:6379         0.0.0.0:0              LISTENING

Redisサービスを開始できます.Redisサービスの停止は、次のコマンドによって行われます.
C:\Program Files\Redis>redis-server --service-stop