列
- ドライバーに必要な設定
- #データベース
- #遅延分散
- ワーク チェーンの接続とキュー
- ##カスタム接続とキュー
- # 指定したキューにタスクを分散します
- 指定した接続にタスクを分散します
- 最大試行回数 頻度制限
- エラー処理
- キューの優先順位
- キュー終了
- #キュー プロセッサの実行
- #接続とキューの指定
- #単一タスクの実行
- キューに入れられたすべてのタスクを処理して終了します
- ##リソース ノート
- ##キュー プロセッサとデプロイメント
- タスクの有効期限とタイムアウト
- #タスクの有効期限 #プロセッサ タイムアウト
- #キュー プロセスのスリープ時間
- スーパーバイザーの構成
- スーパーバイザーの構成
タスク失敗イベント- 失敗したタスクの再試行
- 不足しているモデルを無視する
- クエスト イベント
- # #
Queue
- はじめに
- ##タスクの作成
- 配布タスク
- キューの閉鎖
- #実行キュー プロセッサ
- 失敗したタスクの処理
- 失敗したタスクのクリア
- タスク失敗イベント
- 失敗したタスクの再試行
- 欠落しているモデルを無視する
- クエスト イベント
Laravel キューは、Beanstalk、Amazon SQS、Redis、さらにはリレーショナル データベースに基づく他のキューなど、さまざまなバックグラウンド キュー サービスに統合された API を提供します。キューの目的は、電子メールの送信など、時間のかかるタスクの処理を遅らせ、Web リクエストと応答の時間を大幅に短縮することです。 キュー構成ファイルは、
config/queue.phpファイルに保存されます。このファイルには、データベース、
Beanstalkd、
#ドライバーに必要な設定データベースAmazon SQS
、Redis、同期 (ローカル使用) ドライバーなどの各キュー ドライバーの設定が含まれています。また、キューを放棄するタスク用の null キュー ドライバーも含まれています。データベース
キュードライバーを使用するには、タスクを格納するデータテーブルが必要です。queue:table
Artisan コマンドを実行して、このテーブルの移行ファイルを作成します。移行ファイルが作成されたら、
移行コマンドを使用して移行できます。
php artisan queue:work --queue=high,default
Redis
redis を使用するには
キュー ドライバー。config/database.php
構成ファイルで Redis データベース接続を構成する必要があります。
Redis クラスター
Redis キュー ドライバーが Redis クラスターを使用する場合、キュー名には key ハッシュ タグ
が含まれている必要があります。これは、キューのすべての Redis キーが同じハッシュに配置されるようにするためです。php artisan queue:table php artisan migrate
BlockingRedis キューを使用する場合、block_for
構成項目を使用して、ドライバーがタスクを元の場所に戻すように指定できます。 Redis データベースとプロセッサをポーリングするまでのブロック時間。
に設定すると、タスクが使用可能になるまでドライバーを 5 秒間ブロックする必要があることを示すことができます。新しいタスクについて Redis データベースをポーリングするよりも、キューの負荷に基づいてこの値を調整する方がはるかに効率的です。たとえば、この値を
5rreeee
他のキュードライバーの依存拡張パッケージ
リスト内のキューサービスを使用する前に、次の依存拡張パッケージをインストールする必要があります:
- Amazon SQS:
aws/aws-sdk-php ~3.0
- Beanstalkd:
pda/pheanstalk ~4.0
- Redis:
predis/predis ~1.0
タスクの作成
#タスク クラスの生成
アプリケーションでは、キューのタスク クラスはデフォルトで
app/Jobs
ディレクトリに配置されます。このディレクトリが存在しない場合は、make:job
Artisan コマンドを実行すると自動的に作成されます。次のアーティザン コマンドを使用して、新しいキュー タスクを生成できます:'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => '{default}', 'retry_after' => 90, ],
生成されたクラスは、
Illuminate\Contracts\Queue\ShouldQueue
インターフェイスを実装します。これは、このタスクがプッシュされることを意味します。同期的に実行する代わりにキューに入れます。タスク クラスの構造
タスク クラスの構造は非常に単純です。一般的に、それに含まれるのはこのタスクの
handle
メソッドを呼び出すためのキュー。タスククラスの例を見てみましょう。この例では、ポッドキャスト公開サービスを管理し、公開前にアップロードされたポッドキャスト ファイルを処理する必要があると仮定します。'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, 'block_for' => 5, ],
この例では、タスク クラスのコンストラクターで Eloquent モデルを直接渡していることに注意してください。タスク クラスで
SerializesModels
トレイトを参照しているため、タスクの処理時に Eloquent モデルを適切にシリアル化および逆シリアル化できます。キュー タスク クラスがコンストラクターで Eloquent モデルを受け取る場合、そのモデルを認識するプロパティのみがキューにシリアル化されます。タスクが実際に実行されると、キュー システムはデータベースから完全なモデルを自動的に取得します。このプロセス全体はアプリケーションに対して完全に透過的であるため、完全な Eloquent パターン インスタンスのシリアル化に伴う問題の一部が回避されます。キュー内のタスクを処理するときに、
コンテナが依存オブジェクトをhandle
メソッドが呼び出されます。ここで、Laravel のサービス コンテナに、handle# のパラメータ型プロンプトを通じて依存関係を自動的に挿入させることもできます。 ## メソッド.オブジェクト。
handle
メソッドに挿入する方法を完全に制御したい場合は、コンテナの
bindMethodメソッドを使用できます。
bindMethodこのメソッドはタスクとコンテナーのコールバックを受け入れます。
handleメソッドはコールバック内で直接呼び出すこともできますが、サービス プロバイダーから呼び出すことをお勧めします。
php artisan make:job ProcessPodcast
{note} 画像コンテンツなどのバイナリ データは、キュータスクに入る前に、
base64_encode
メソッドを使用してタスクを変換する必要があります。そうしないと、このタスクがキューに置かれたときに、JSON に正しくシリアル化されない可能性があります。
タスクの配布
タスク クラスの作成が完了したら、独自の
dispatch
メソッドを使用してタスク クラスを配布できます。dispatch
メソッドに渡されたパラメータは、タスクのコンストラクターに渡されます:<?php namespace App\Jobs; use App\Podcast; use App\AudioProcessor; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class ProcessPodcast implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 创建一个新的任务实例。 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; } /** * 运行任务。 * * @param AudioProcessor $processor * @return void */ public function handle(AudioProcessor $processor) { // Process uploaded podcast... } }
Delayed Dispatch
キュー タスクの実行を遅らせたい場合は、タスクを分散するときに
lay
メソッドを使用できます。たとえば、10 分まで実行されないタスクについて詳しく説明します。use App\Jobs\ProcessPodcast; $this->app->bindMethod(ProcessPodcast::class.'@handle', function ($job, $app) { return $job->handle($app->make(AudioProcessor::class)); });
{note} Amazon SQS キュー サービスの最大レイテンシは 15 分です。
同期スケジューリング
キュー タスクをすぐに (同期的に) 実行したい場合は、次のようにすることができます。
dispatchNow
メソッドを使用します。この方法を使用すると、キュー タスクはキューに登録されず、現在のプロセスですぐに実行されます:<?php namespace App\Http\Controllers; use App\Jobs\ProcessPodcast; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PodcastController extends Controller{ /** * 存储一个新的播客节目。 * * @param Request $request * @return Response */ public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast); } }
Workchain
ワーク チェーンを使用すると、順番に実行されるキュー タスクのリストを具体的に定義できます。シーケンス内のタスクが失敗すると、残りの作業は実行されません。ジョブ チェーンを実行するには、分散可能タスクで
withChain
メソッドを使用できます:<?php namespace App\Http\Controllers; use App\Jobs\ProcessPodcast; use Illuminate\Http\Request; use App\Http\Controllers\Controller;class PodcastController extends Controller{ /** * 存储一个新的播客节目。 * * @param Request $request * @return Response */ public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast) ->delay(now()->addMinutes(10)); } }
{note} use
$this->delete()
キュータスクを削除するメソッドは、ワークチェーンタスクの実行を妨げません。ワーク チェーンは、ワーク チェーン内のタスクの実行に失敗した場合にのみ実行を停止します。ワークチェーンの接続とキュー
ワークチェーンに使用されるデフォルトの接続とキューを定義する場合は、
allOnConnection
を使用できます。およびallOnQueue
メソッド。これらのメソッドは、キュー タスクが別の接続/キューに明示的に割り当てられていない限り、目的のキューの接続とキューを指定します。 #カスタム接続とキュータスクをさまざまなキューに分散することで、キューのタスクを「分類」でき、タスクの数も指定できます。異なるキューに割り当てられます。これは、定義したキュー構成ファイル内の異なる接続にタスクをプッシュするのではなく、単一の接続にタスクをプッシュすることに注意してください。キューを指定するには、タスクを分散するときにonQueueメソッドを使用します。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Jobs\ProcessPodcast; use App\Http\Controllers\Controller; class PodcastController extends Controller{ /** * Store a new podcast. * * @param Request $request * @return Response */ public function store(Request $request) { // Create podcast... ProcessPodcast::dispatchNow($podcast); } }
指定された接続にタスクを分散します
マルチキュー接続 では、タスクを分散する接続を指定できます。接続を指定するには、タスクをディスパッチするときに
onConnection
メソッドを使用します。ProcessPodcast::withChain([ new OptimizePodcast, new ReleasePodcast ])->dispatch();
もちろん、onConnectionメソッドと
onQueueメソッドを連鎖させることもできます。接続とキューを指定します。
ProcessPodcast::withChain([ new OptimizePodcast, new ReleasePodcast ])->dispatch()->allOnConnection('redis')->allOnQueue('podcasts');
タスクの最大試行回数/タイムアウト値を指定します
最大試行回数
タスクの最大試行回数は、アーティザン コマンド
-- Trys
オプションは次のように指定します:<?php namespace App\Http\Controllers; use App\Jobs\ProcessPodcast; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PodcastController extends Controller{ /** * 存储一个新的播客节目。 * * @param Request $request * @return Response */ public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast)->onQueue('processing'); } }
タスク クラス自体を使用して、タスク試行の最大数をより詳細に処理したい場合があります。最大試行回数がタスク クラスで定義されている場合は、コマンド ラインの値よりも優先して指定されます:
<?php namespace App\Http\Controllers; use App\Jobs\ProcessPodcast; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class PodcastController extends Controller{ /** * 存储一个新播客节目。 * * @param Request $request * @return Response */ public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast)->onConnection('sqs'); } }
試行時間に基づく
# 失敗するまでにタスクを試行する回数を定義する代わりに、タスクのタイムアウトを定義できます。このようにして、指定された時間枠内でタスクを無制限に試行できます。タスクのタイムアウトを定義するには、retryUntil
メソッドをタスク クラスに追加します。
ProcessPodcast::dispatch($podcast) ->onConnection('sqs') ->onQueue('processing');
{tip}
TimeoutretryUntil
メソッドを使用します。メソッドをキュー イベント リスナー
retryUntil
PHP で利用できます。拡張機能 Optimized.{note}
timeout機能は、PHP 7.1 および
pcntl
オプションを使用して指定できます。同様に、タスク実行の最大秒数の値は、Artisan コマンド ラインの
--timeoutphp artisan queue:work --tries=3
ただし、タスク クラス自体でタイムアウトを定義することもできます。タスク クラスで指定した場合、優先度はコマンド ラインよりも高くなります:<?phpnamespace App\Jobs;class ProcessPodcast implements ShouldQueue{ /** * 任务可以尝试的最大次数。 * * @var int */ public $tries = 5;}
###周波数制限
{note} この機能を使用するには、アプリケーションが Redis サーバーを使用できる必要があります。
アプリケーションが Redis を使用している場合は、時間や同時実行性を渡すことができます。キュータスクの制限。この機能は、キュー タスクがレート制限のある API を介して消費される場合に役立ちます。
たとえば、
throttle
メソッドを使用すると、特定のタイプのタスクの実行を 60 秒ごとに 10 回のみに制限できます。ロックが取得されない場合は、通常、後で再試行できるようにタスクをキューに戻す必要があります。/** * 定义任务超时时间 * * @return \DateTime */ public function retryUntil(){ return now()->addSeconds(5); }
{tip} 上記の例では、
key
には、頻度を制限するタスク タイプを識別する任意の文字列を指定できます。たとえば、タスク クラス名、またはウィジェットが動作する Eloquent モデルの ID に基づいてウィジェットのキーを使用します。{note} 制限されたジョブをキューに解放しても、ジョブの合計数は
試行
によって増加します。同時に実行できるタスクの最大数を指定することもできます。これは、キュー内のタスクが、一度に 1 つのタスクしか変更できないリソースを変更している場合に便利です。たとえば、
funnel
メソッドを使用すると、特定のタイプのタスクを一度に 1 つのプロセッサでのみ実行するように制限できます。php artisan queue:work --timeout=30
#エラー処理タスクの実行中に例外が発生した場合、タスクは自動的に解放されます。キューに入れて再試行してください。タスクは、アプリケーションで許可されている最大再試行回数に達するまで解放されます。最大再試行値は、{tip} 周波数制限を使用する場合、タスクの実行 成功した試行回数を判断するのは難しい場合があります。したがって、頻度制限と 時間制限を組み合わせると便利です。
queue:work
#キュー クロージャタスク クラスをキューにスケジュールする代わりに、クロージャを直接呼び出すこともできます。これは、実行する必要がある迅速で単純なタスクに役立ちます。Artisan コマンドの
--triesオプション、またはタスク クラスで定義されます。実行キュー ハンドラーの詳細については、以下の
を参照してください。
クロージャがキューにディスパッチされると、クロージャのコード内容は暗号的に署名されるため、転送中に変更することはできません。<?php namespace App\Jobs;class ProcessPodcast implements ShouldQueue{ /** * 任务可以执行的最大秒数 (超时时间)。 * * @var int */ public $timeout = 120;}
実行キュープロセッサ
Laravelには、キューにプッシュされたタスクを実行するためのキュープロセッサが含まれています。
queue:work
Artisan コマンドを使用してプロセッサを実行できます。queue:work
コマンドの実行が開始されると、手動で停止するかターミナルを閉じるまで実行が継続されることに注意してください。Redis::throttle('key')->allow(10)->every(60)->then(function () { // 任务逻辑... }, function () { // 无法获得锁... return $this->release(10); });
{ヒント}
queue:work
プロセスをバックグラウンドで実行し続けるには、Supervisor などのプロセス マネージャーを使用して、キュー プロセッサは実行を停止しません。キュー プロセッサは常駐プロセスであり、開始されたアプリケーションの状態をメモリに保存することに注意してください。したがって、起動後にコードが変更されたことに気づくことはありません。そのため、再デプロイメント中は、キュー ハンドラーを再起動することを忘れないでください。
接続とキューを指定する
どのキュー接続を指定することもできます。キュープロセッサが使用する必要があります。
work
に渡される接続名は、config/queue.php
構成ファイルで定義されている接続の 1 つと一致する必要があります。Redis::funnel('key')->limit(1)->then(function () { // 任务逻辑...}, function () { // 无法获得锁... return $this->release(10); });
接続で指定されたキューのみを実行するようにキュー ハンドラーをカスタマイズすることもできます。たとえば、すべての電子メールが
redis
接続のemails
キューによって処理される場合、次のコマンドを使用してこのキューのみを実行するプロセッサを起動できます:$podcast = App\Podcast::find(1); dispatch(function () use ($podcast) { $podcast->publish(); });
単一タスクの実行
--once
オプションは、キュー プロセッサがキュー内の 1 つのタスクのみを処理するようにするために使用されます。php artisan queue:work
キューに登録されたすべてのタスクを処理してから終了します。
--stop-when-empty
オプションを使用して、キュー プロセッサを処理することができます。すべてのジョブを実行し、正常に終了します。このオプションは、Docker コンテナで Laravel キューを実行するときに、キューが空になった後にコンテナをシャットダウンしたい場合に便利です:php artisan queue:work redis
リソース ノート
バックグラウンド常駐残りのキュー ハンドラーは、各タスクの実行後にフレームワークを「再起動」しません。したがって、各タスクが完了したら、過剰なリソースを解放する必要があります。たとえば、GD ライブラリを使用して画像処理を実行している場合は、終了時に
imagedestroy
を使用してメモリを解放する必要があります。キューの優先順位
キューの実行に優先順位を付けたい場合があります。たとえば、
lowconfig/queue.php
で、redis
に接続されているqueue
キューの優先度をdefault
から ## に設定できます。 # 低い###。ただし、場合によっては、次のようにタスクをhigh
キューにプッシュすることもできます。
でプロセッサを実行し、php artisan queue:work redis --queue=emails
キュー内のタスクが実行されていることを確認します。 in all
##キュー プロセッサとデプロイメントキュー プロセッサは常駐プロセスであるため、コードの変更は適用されません。 。したがって、キュー プロセッサを使用するアプリケーションをデプロイする最も簡単な方法は、デプロイメント プロセス中にキュー プロセッサを再起動することです。high
キュー タスクの完了後にのみ実行を継続するには、キュー名のカンマ区切りリストを引数としてwork
コマンドに渡すことができます。php artisan queue:work --once
queue:restart
メソッドを使用して、すべてのキュー プロセッサを正常に再起動できます。php artisan queue:work --stop-when-empty
このコマンドにより、現在のタスクの完了後にすべてのキュー プロセッサが正常に「中止」されます。失われたミッションはありません。キュー プロセッサは
queue:restart の実行後に終了するため、Supervisor
などのプロセス マネージャーを実行してキュー プロセッサを自動的に再起動する必要があります。
{ヒント} キューはキャッシュを使用して再起動信号を保存するため、この機能を使用する前にキャッシュ ドライバーを必ず設定する必要があります。##タスクの有効期限
構成ファイルでは、各キュー接続にretry_afterオプションが定義されています。このオプションは、キュー接続がタスクを再試行するまで待機する時間を指定します。たとえば、
retry_afterの値が
90
に設定されている場合、タスクは実行の 90 秒後に削除されずにキューに戻されます。一般に、retry_after
の値は、タスクの実行に最も時間がかかると思われる値に設定する必要があります。{note}
retry_after値は Amazon SQS にのみ存在するわけではありません。 SQS は、AWS コンソールで設定されたデフォルトの表示タイムアウト値に基づいてタスクを再試行します。
プロセッサ タイムアウト
queue:work
Artisan コマンドには--timeout
オプションが含まれています。--timeout
オプションは、タスクを実行している子プロセスを中止する前に、Laravel のキューマスタープロセスが待機する時間を指定します。場合によっては、外部 HTTP リクエストへの応答の失敗など、さまざまな理由で子プロセスが「フリーズ」することがあります。--timeout
オプションは、指定された時間より長くフリーズされたプロセスを削除します。dispatch((new Job)->onQueue('high'));
retry_after
構成項目と--timeout
コマンドライン構成は同じではありませんが、同時に使用することでタスクが失われることはありません。また、タスクは 1 回だけ正常に実行されます。{note}
--timeout
の値は、retry_after
で設定した値より少なくとも数秒短くする必要があります。これにより、タスクを再試行する前にプロセッサが常に中止されることが保証されます。--timeout
値がretry_after
の値より長い場合、タスクが 2 回実行される可能性があります。キュー プロセスのスリープ時間
タスクがキュー内にある場合、プロセッサは間隔を置かずに常にタスクを処理します。ただし、
sleep
オプションは、新しいタスクがない場合にプロセッサが「スリープ」する時間を定義します。プロセッサがスリープしている間は、新しいタスクは処理されません。タスクは、キュー プロセッサが再度起動されると実行されます。php artisan queue:work --queue=high,low
スーパーバイザーの構成
スーパーバイザーのインストール
スーパーバイザーは Linux です
queue:work
がハングしたときに自動的に再起動できるオペレーティング システム上のプロセス モニター。 Ubuntu に Supervisor をインストールするには、次のコマンドを使用できます:php artisan queue:restart
{ヒント} Supervisor の構成が難しい場合は、Laravel Forge の使用を検討できます。 Laravel プロジェクト用に Supervisor を自動的にインストールして設定します。
スーパーバイザーの設定
スーパーバイザー設定ファイルは通常、
/etc/supervisor/conf.d
ディレクトリにあります。このディレクトリには、スーパーバイザがプロセスを監視する方法を制御するために、任意の数の構成ファイルを作成できます。たとえば、laravel-worker.conf
ファイルを作成して、queue:work
プロセスを開始および監視します。php artisan queue:work --timeout=60
この例では、
numprocs
ディレクティブは、8 つのqueue:work
プロセスを実行して監視し、ハングした場合に自動的に再起動するようにスーパーバイザーを指定します。必要なキュー接続を表すように、command
オプションのqueue:work sqs
部分を変更する必要があります。Start Supervisor
設定ファイルが作成されたら、次のコマンドを使用してスーパーバイザ設定を更新し、プロセスを開始できます:
php artisan queue:work --sleep=3
スーパーバイザの詳細については、次のコマンドを使用して確認できます。 Supervisor Documentation.
失敗したタスクの処理
キューに入れられたタスクの実行が失敗することがあります。 。心をリラックスしてください。良いことは時間内にのみやって来ます。 Laravel には、タスクを試行する最大回数を指定する便利なメソッドが含まれています。ジョブが最大試行回数に達した場合、そのジョブは
failed_jobs
データベース テーブルに挿入されます。failed_jobs
データベース移行テーブルを作成するには、queue:failed-table
コマンドを使用できます。sudo apt-get install supervisor
次に、queue worker# を実行します。 ##、queue:work
コマンドで
--triesスイッチを使用して、タスクの実行を試行する最大回数を指定する必要があります。
--triesオプションに値が指定されていない場合、無限ループによってタスクの実行が試行されます:
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 autostart=true autorestart=true user=forge numprocs=8 redirect_stderr=true stdout_logfile=/home/forge/app.com/worker.log
failed
メソッドを定義すると、タスクが失敗したときにタスクのクリーンアップ作業を実行できます。これは、ユーザーにアラートを送信したり、タスクによって実行されたアクションを再開したりするのに最適な場所です。タスクを失敗させる
Exceptionは、
failedメソッドに渡されます:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
Queue::failing
メソッドを使用できます。このイベントは、メールまたは
Slack でチームに通知するのに最適な機会です。たとえば、Laravel の AppServiceProviderにコールバック イベントを添付できます:
php artisan queue:failed-table php artisan migrate
失敗したタスクを再試行failed_jobs
データ テーブルに配置されているすべてのタスクを表示するには、Artisan コマンド
queue:failed:
php artisan queue:work redis --tries=3
を使用できます。 queue:failed
このコマンドにより、タスク ID、キュー、および失敗時間がリストされます。タスク ID は、失敗したタスクを再試行するために使用できます。たとえば、タスク ID
5のタスクを再試行するには、次のコマンドを使用します。
<?php namespace App\Jobs; use Exception;use App\Podcast; use App\AudioProcessor; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class ProcessPodcast implements ShouldQueue{ use InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 创建任务实例 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; } /** * 执行任务 * * @param AudioProcessor $processor * @return void */ public function handle(AudioProcessor $processor) { // 上传播客…… } /** * 任务失败的处理过程 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 给用户发送任务失败的通知,等等…… } }
失敗したすべてのタスクを再試行するには、queue:retry
コマンドを実行し、Pass
allを ID として使用します:
<?php namespace App\Providers; use Illuminate\Support\Facades\Queue; use Illuminate\Queue\Events\JobFailed; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider{ /** * 启动任意服务。 * * @return void */ public function boot() { Queue::failing(function (JobFailed $event) { // $event->connectionName // $event->job // $event->exception }); } /** * 注册服务提供者。 * * @return void */ public function register() { // } }
失敗したタスクを削除する場合は、queue:forget
コマンドを使用します:
php artisan queue:failed
失敗したすべてのタスクについては、queue:flush
コマンドを使用します:
php artisan queue:retry 5
不足しているモデルを無視する
Eloquent モデルをタスクに挿入すると、モデルはキューに入れられる前に自動的にシリアル化され、タスクの実行時に復元されます。ただし、タスクの実行待機中にモデルが削除された場合、タスクは
ModelNotFoundException
で失敗する可能性があります。便宜上、タスクの
deleteWhenMissingModels
プロパティをtrue
に設定して、モデルが欠落しているタスクを自動的に削除することを選択できます。php artisan queue:retry all
タスク イベント
Queue
ファサードでbefore# を使用する## メソッドと
afterメソッドでは、キュー タスクの実行前後にコールバックを指定できます。これらのコールバックは、ログを追加したり、統計を増やしたりする絶好の機会となります。通常、これらのメソッドはサービス プロバイダーで呼び出す必要があります。たとえば、Laravel の
AppServiceProviderを使用できます。
php artisan queue:forget 5
Queue
ファサードの
loopingメソッドを使用して、プロセッサがコールバックを実行する前にコールバックを実行します。タスクを取得します。たとえば、クロージャを使用して、以前に失敗したタスクによってまだクローズされていないトランザクションをロールバックすることができます。
php artisan queue:flush
この記事は、LearnKu.com Web サイトに初めて掲載されました。