イントロダクションIntroduction
Laravelのキューサービスは、様々なキューバックエンドに対し共通のAPIを提供しています。キューによりメール送信のような時間を費やす処理を遅らせることが可能です。これによりアプリケーションのリクエストを徹底的に引き上げることができます。The Laravel queue service provides a unified API across a variety of different queue back-ends. Queues allow you to defer the processing of a time consuming task, such as sending an e-mail, until a later time which drastically speeds up web requests to your application.
設定Configuration
キューの設定ファイルはconfig/queue.php
です。このファイルにはフレームワークに含まれているそれぞれのドライバーへの接続設定が含まれています。それにはデータベース、Beanstalkd、IronMQ、Amazon SQS、Redis、同期(ローカル用途)ドライバーが含まれています。The queue configuration file is stored in config/queue.php
. In this file you will find connection configurations for each of the queue drivers that are included with the framework, which includes a database, Beanstalkd[http://kr.github.com/beanstalkd], IronMQ[http://iron.io], Amazon SQS[http://aws.amazon.com/sqs], Redis[http://redis.io], and synchronous (for local use) driver.
null
キュードライバーはキューされたジョブが実行されないように、破棄するだけです。A null
queue driver is also included which simply discards queued jobs.
ドライバー毎の必要要件Driver Prerequisites
データベースDatabase
database
キュードライバーを使用するには、ジョブを記録するためのデータベーステーブルが必要です。このテーブルを作成するマイグレーションはqueue:table
Artisanコマンドにより生成できます。マイグレーションが生成されたら、migrate
コマンドでデータベースをマイグレートしてください。In order to use the database
queue driver, you will need a database table to hold the jobs. To generate a migration that creates this table, run the queue:table
Artisan command. Once the migration is created, you may migrate your database using the migrate
command:
php artisan queue:table
php artisan migrate
他のドライバーに必要なパッケージOther Queue Dependencies
以下の依存パッケージがリストしたキュードライバーを使用するために必要です。The following dependencies are needed for the listed queue drivers:
- Amazon SQS:
aws/aws-sdk-php ~3.0
Amazon SQS:aws/aws-sdk-php ~3.0
- Beanstalkd:
pda/pheanstalk ~3.0
Beanstalkd:pda/pheanstalk ~3.0
- IronMQ:
iron-io/iron_mq ~2.0|~4.0
IronMQ:iron-io/iron_mq ~2.0|~4.0
- Redis:
predis/predis ~1.0
Redis:predis/predis ~1.0
ジョブクラスを書くWriting Job Classes
ジョブクラスの生成Generating Job Classes
キュー投入可能なアプリケーションの全ジョブは、デフォルトでapp/Jobs
ディレクトリーへ保存されます。新しいキュー投入ジョブはArtisan CLIで生成できます。By default, all of the queueable jobs for your application are stored in the app/Jobs
directory. You may generate a new queued job using the Artisan CLI:
php artisan make:job SendReminderEmail --queued
このコマンドにより新しいクラスがapp/Jobs
ディレクトリーに生成され、そのクラスは同期的に実行する代わりにキューへジョブを投入することをLaravelに知らせる目印となる、Illuminate\Contracts\Queue\ShouldQueue
インターフェイスを実装しています。This command will generate a new class in the app/Jobs
directory, and the class will implement the Illuminate\Contracts\Queue\ShouldQueue
interface, indicating to Laravel that the job should be pushed onto the queue instead of run synchronously.
ジョブクラスの構造Job Class Structure
ジョブクラスはとてもシンプルでキューでジョブが処理されるときに呼び出されるhandle
メソッドだけで通常構成されています。手始めにこのジョブクラスを確認してみましょう。Job classes are very simple, normally containing only a handle
method which is called when the job is processed by the queue. To get started, let's take a look at an example job class:
<?php
namespace App\Jobs;
use App\User;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $user;
/**
* 新しいジョブインスタンスの生成
*
* @param User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* ジョブの実行
*
* @param Mailer $mailer
* @return void
*/
public function handle(Mailer $mailer)
{
$mailer->send('emails.reminder', ['user' => $this->user], function ($m) {
//
});
$this->user->reminders()->create(...);
}
}
この例中、キュージョブのコンテナーに直接Eloquentモデルが渡せることに注目してください。ジョブが使用しているSerializesModels
トレイトによりEloquentモデルは優雅にシリアライズされ、ジョブが処理される時にアンシリアライズされます。キュー投入されたジョブがコンテナでEloquentモデルを受け取ると、モデルの識別子のみシリアライズされています。ジョブが実際に処理される時、キューシステムは自動的にデータベースから完全なモデルインスタンスを再取得します。これらは全てアプリケーションの完全な透過性のためであり、Eloquentモデルインスタンスをシリアライズするときに発生する問題を防ぐことができます。In this example, note that we were able to pass an Eloquent model[/docs/{{version}}/eloquent] directly into the queued job's constructor. Because of the SerializesModels
trait that the job is using, Eloquent models will be gracefully serialized and unserialized when the job is processing. If your queued job accepts an Eloquent model in its constructor, only the identifier for the model will be serialized onto the queue. When the job is actually handled, the queue system will automatically re-retrieve the full model instance from the database. It's all totally transparent to your application and prevents issues that can arise from serializing full Eloquent model instances.
handle
メソッドはキューによりジョブが処理されるときに呼びだされます。ジョブのhandle
メソッドにタイプヒントにより依存を指定できることに注目してください。Laravelのサービスコンテナが自動的に依存を注入します。The handle
method is called when the job is processed by the queue. Note that we are able to type-hint dependencies on the handle
method of the job. The Laravel service container[/docs/{{version}}/container] automatically injects these dependencies.
上手く行かない場合When Things Go Wrong
ジョブの実行時に例外が投げられると、再実行を試みれるように自動的にキューへ戻されます。ジョブはアプリケーションが許している最大回数まで続けて再実行されます。最大再実行回数はqueue:listen
かqueue:work
Artisanコマンド実行時に--tries
スイッチで指定します。キューリスナーの詳細はこの後に記述します。If an exception is thrown while the job is being processed, it will automatically be released back onto the queue so it may be attempted again. The job will continue to be released until it has been attempted the maximum number of times allowed by your application. The number of maximum attempts is defined by the --tries
switch used on the queue:listen
or queue:work
Artisan jobs. More information on running the queue listener can be found below[#running-the-queue-listener].
ジョブを手動でリリースするManually Releasing Jobs
ジョブを自分で再実行したい場合、生成したジョブクラスでは含まれているInteractsWithQueue
トレイトが提供するキュージョブのrelease
メソッドを使用してください。release
メソッドは引数をひとつだけ取り、そのジョブを再実行可能にするまで待機する秒数を指定します。If you would like to release
the job manually, the InteractsWithQueue
trait, which is already included in your generated job class, provides access to the queue job release
method. The release
method accepts one argument: the number of seconds you wish to wait until the job is made available again:
public function handle(Mailer $mailer)
{
if (condition) {
$this->release(10);
}
}
実行試行回数のチェックChecking The Number Of Run Attempts
前述の通り、ジョブの処理中に例外が起きた場合、そのジョブは自動的にキューに再登録されます。ジョブを実行しようとした試行回数をattempts
メソッドで調べることができます。As noted above, if an exception occurs while the job is being processed, it will automatically be released back onto the queue. You may check the number of attempts that have been made to run the job using the attempts
method:
public function handle(Mailer $mailer)
{
if ($this->attempts() > 3) {
//
}
}
ジョブのキュー投入Pushing Jobs Onto The Queue
デフォルトLaravelコントローラーのapp/Http/Controllers/Controller.php
はDispatchesJobs
トレイトを使っています。このトレイトはdispatch
メソッドのような、キューへジョブを便利に投入できるようにいくつかのメソッドを提供しています。The default Laravel controller located in app/Http/Controllers/Controller.php
uses a DispatchesJobs
trait. This trait provides several methods allowing you to conveniently push jobs onto the queue, such as the dispatch
method:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 指定ユーザーにリマインダーメールを送信する
*
* @param Request $request
* @param int $id
* @return Response
*/
public function sendReminderEmail(Request $request, $id)
{
$user = User::findOrFail($id);
$this->dispatch(new SendReminderEmail($user));
}
}
もちろんルートやコントローラーではないアプリケーションのどこからか、ジョブをディスパッチしたいこともあるでしょう。そのためDispatchesJobs
トレイトはアプリケーションのどのクラスでも使えるようになっており、多くのディスパッチメソッドにアクセスできます。このトレイトを使用するサンプルクラスを見てください。Of course, sometimes you may wish to dispatch a job from somewhere in your application besides a route or controller. For that reason, you can include the DispatchesJobs
trait on any of the classes in your application to gain access to its various dispatch methods. For example, here is a sample class that uses the trait:
<?php
namespace App;
use Illuminate\Foundation\Bus\DispatchesJobs;
class ExampleClass
{
use DispatchesJobs;
}
ジョブのキュー指定Specifying The Queue For A Job
さらに特定のキューにジョブを送ることもできます。You may also specify the queue a job should be sent to.
ジョブを異なったキューに送ることでキューするジョブを「カテゴリー分け」できます。さらに様々なキューにいくつのワーカーを割りつけるかによりプライオリティー付けできます。これはキュー設定ファイルで定義されている別々のキュー「接続」へジョブを送るという意味ではなく、一つの接続に対しキューを指定するだけで実現できます。キューを指定するにはジョブインスタンスのonQueue
メソッドを使います。onQueue
メソッドはApp\Jobs\Job
基礎クラスに含まれる、Illuminate\Bus\Queueable
トレイトにより提供しています。By pushing jobs to different queues, you may "categorize" your queued jobs, and even prioritize how many workers you assign to various queues. This does not push jobs to different queue "connections" as defined by your queue configuration file, but only to specific queues within a single connection. To specify the queue, use the onQueue
method on the job instance. The onQueue
method is provided by the Illuminate\Bus\Queueable
trait, which is already included on the App\Jobs\Job
base class:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 指定ユーザーにリマインダーメールを送信する
*
* @param Request $request
* @param int $id
* @return Response
*/
public function sendReminderEmail(Request $request, $id)
{
$user = User::findOrFail($id);
$job = (new SendReminderEmail($user))->onQueue('emails');
$this->dispatch($job);
}
}
遅延ジョブDelayed Jobs
投入したキュージョブの実行を遅らせたい場合もあるでしょう。たとえばサインアップの5分後に顧客へメールを送信するジョブをキューしたい場合などです。この場合、Illuminate\Bus\Queueable
が提供しているdelay
メソッドを使用して下さい。Sometimes you may wish to delay the execution of a queued job. For instance, you may wish to queue a job that sends a customer a reminder e-mail 15 minutes after sign-up. You may accomplish this using the delay
method on your job class, which is provided by the Illuminate\Bus\Queueable
trait:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 指定ユーザーにリマインダーメールを送信する
*
* @param Request $request
* @param int $id
* @return Response
*/
public function sendReminderEmail(Request $request, $id)
{
$user = User::findOrFail($id);
$job = (new SendReminderEmail($user))->delay(60);
$this->dispatch($job);
}
}
この例ではワーカーにより実行可能にするまでキューの中のジョブを60秒遅延させると指定しています。In this example, we're specifying that the job should be delayed in the queue for 60 seconds before being made available to workers.
注目: Amazon SQSサービスには、遅延900秒(15分)という制限があります。Note: The Amazon SQS service has a maximum delay time of 15 minutes.
リクエストからのジョブディスパッチDispatching Jobs From Requests
HTTPリクエストの変数をコマンドへマップしたいと考えるのは当然でしょう。それぞれのリクエストを手動で無理やりマップする代わりに、Laravelでは簡単に実現できるヘルパメソッドを用意しています。DispatchesJobs
トレイトで使用できるdispatchFrom
メソッドを取り上げてみてみましょう。デフォルトでこのクラスはLaravelの基礎コントローラークラスに含まれています。It is very common to map HTTP request variables into jobs. So, instead of forcing you to do this manually for each request, Laravel provides some helper methods to make it a cinch. Let's take a look at the dispatchFrom
method available on the DispatchesJobs
trait. By default, this trait is included on the base Laravel controller class:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class CommerceController extends Controller
{
/**
* 指定された注文の処理
*
* @param Request $request
* @param int $id
* @return Response
*/
public function processOrder(Request $request, $id)
{
// リクエストの処理…
$this->dispatchFrom('App\Jobs\ProcessOrder', $request);
}
}
このメソッドは指定されたコマンドクラスのコンストラクターを調べ、それからHTTPリクエスト(もしくは他のArrayAccess
オブジェクト)から変数を取り出し、必要なコマンドのコンストラクター引数を埋めます。ですからもしコマンドクラスがコンストラクターでproductId
変数を取る場合、コマンドバスはHTTPリクエストからproductId
パラメーターを取り出そうとします。This method will examine the constructor of the given job class and extract variables from the HTTP request (or any other ArrayAccess
object) to fill the needed constructor parameters of the job. So, if our job class accepts a productId
variable in its constructor, the job bus will attempt to pull the productId
parameter from the HTTP request.
dispatchFrom
メソッドはさらに第3引数に配列を指定できます。この配列はリクエストからは埋められないコンストラクター引数を埋めるために使用されます。You may also pass an array as the third argument to the dispatchFrom
method. This array will be used to fill any constructor parameters that are not available on the request:
$this->dispatchFrom('App\Jobs\ProcessOrder', $request, [
'taxPercentage' => 20,
]);
ジョブイベントJob Events
ジョブ完了イベントJob Completion Event
Queue:after
メソッドにより、キューされたジョブの実行が成功した場合に起動されるコールバックを登録できます。このコールバックは追加のログを行ったり、続けて別のジョブをキューしたり、ダッシュボードに表示する情報を造化させたりするために最適でしょう。たとえばLaravelに含まれるAppServiceProvider
にイベントのコールバックを追加してみましょう。The Queue::after
method allows you to register a callback to be executed when a queued job executes successfully. This callback is a great opportunity to perform additional logging, queue a subsequent job, or increment statistics for a dashboard. For example, we may attach a callback to this event from the AppServiceProvider
that is included with Laravel:
<?php
namespace App\Providers;
use Queue;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 全アプリケーションサービスの初期処理
*
* @return void
*/
public function boot()
{
Queue::after(function ($connection, $job, $data) {
//
});
}
/**
* サービスプロバイダーの登録
*
* @return void
*/
public function register()
{
//
}
}
キューリスナーの実行Running The Queue Listener
キューリスナーの起動Starting The Queue Listener
LaravelのArtisanは新しくキューに保存されたジョブを実行するコマンドを含んでいます。queue:listen
コマンドを使いリスナーを実行できます。Laravel includes an Artisan command that will run new jobs as they are pushed onto the queue. You may run the listener using the queue:listen
command:
php artisan queue:listen
リスナーに使用するキュー接続を指定することもできます。You may also specify which queue connection the listener should utilize:
php artisan queue:listen connection
このタスクを一度開始したら、手動で停止しない限り実行を続けることに注意してください。Supervisorのようなプロセスモニターを利用し、キューリスナーが確実に動作し続けるようにしてください。Note that once this task has started, it will continue to run until it is manually stopped. You may use a process monitor such as Supervisor[http://supervisord.org/] to ensure that the queue listener does not stop running.
キューの優先度Queue Priorities
listen
コマンドにキューのプライオリティーを設定するため、キュー接続をカンマ区切りで指定することもできます。You may pass a comma-delimited list of queue connections to the listen
job to set queue priorities:
php artisan queue:listen --queue=high,low
この例でhigh
はlow
のジョブを実行する前にいつも処理されます。In this example, jobs on the high
queue will always be processed before moving onto jobs from the low
queue.
ジョブのタイムアウトパラメータ指定Specifying The Job Timeout Parameter
それぞれのジョブの実行時間を秒数で指定することもできます。You may also set the length of time (in seconds) each job should be allowed to run:
php artisan queue:listen --timeout=60
キュー休止時間の指定Specifying Queue Sleep Duration
さらに新しいジョブをポーリングする前に、待ち秒数を指定することもできます。In addition, you may specify the number of seconds to wait before polling for new jobs:
php artisan queue:listen --sleep=5
キューにジョブがない場合のみキューがスリープすることに注意して下さい。もしジョブが存在しているなら、キューはスリープせずに処理を続けます。Note that the queue only "sleeps" if no jobs are on the queue. If more jobs are available, the queue will continue to work them without sleeping.
Supervisor設定Supervisor Configuration
SupervisorはLinuxオペレーティングシステムの監視プロセスで、queue:listen
やqueue:work
コマンドが落ちていれば自動的に再起動してくれます。UbuntuにSupervisorをインストールするには、次のコマンドで行います。Supervisor is a process monitor for the Linux operating system, and will automatically restart your queue:listen
or queue:work
commands if they fail. To install Supervisor on Ubuntu, you may use the following command:
sudo apt-get install supervisor
Supervisorの設定ファイルは通常/etc/supervisor/conf.d
ディレクトリーに保存します。このディレクトリーの中には、Supervisorにどのようにプロセスを監視するのか指示する設定ファイルを好きなだけおくことができます。たとえば、laravel-worker.conf
ファイルを作成し、queue:work
プロセスを起動、監視させてみましょう。Supervisor configuration files are typically stored in the /etc/supervisor/conf.d
directory. Within this directory, you may create any number of configuration files that instruct supervisor how your processes should be monitored. For example, let's create a laravel-worker.conf
file that starts and monitors a queue:work
process:
[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 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
この例のnumprocsディレクティブはSupervisorに全部で8つのqueue:workプロセスを実行・監視し、落ちていれば自動的に再起動するように指示しています。もちろんcommand
ディレクティブのqueue:work sqs
の部分を変更し、選択したドライバーに合わせてください。In this example, the numprocs
directive will instruct Supervisor to run 8 queue:work
processes and monitor all of them, automatically restarting them if they fail. Of course, you should change the queue:work sqs
portion of the command
directive to reflect your chosen queue driver.
設定ファイルができたら、Supervisorの設定を更新し起動するために以下のコマンドを実行してください。Once the configuration file has been created, you may update the Supervisor configuration and start the processes using the following commands:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
Supervisorの設定と使用法の詳細は、Supervisorのドキュメントを読んでください。もしくは便利なWebインターフェイスからSupervisorを設定、管理できるLaravel Forgeを使うこともできます。For more information on configuring and using Supervisor, consult the Supervisor documentation[http://supervisord.org/index.html]. Alternatively, you may use Laravel Forge[https://forge.laravel.com] to automatically configure and manage your Supervisor configuration from a convenient web interface.
デーモンキューリスナーDaemon Queue Listener
queue:work
はフレームワークを再起動せずに連続してジョブを処理し続けるようにキューワーカーを強制するために--daemon
オプションも備えています。これによりqueue:listen
と比較すると、CPU使用率を大幅に引き下げることができます。The queue:work
Artisan command includes a --daemon
option for forcing the queue worker to continue processing jobs without ever re-booting the framework. This results in a significant reduction of CPU usage when compared to the queue:listen
command:
キュー・ワーカーをデーモンモードで開始するためには、--daemon
フラッグを使用します。To start a queue worker in daemon mode, use the --daemon
flag:
php artisan queue:work connection --daemon
php artisan queue:work connection --daemon --sleep=3
php artisan queue:work connection --daemon --sleep=3 --tries=3
ご覧の通りqueue:work
コマンドはqueue:listen
で使用できるものと、ほぼ同じオプションをサポートしています。php artisan help queue:work
コマンドで全オプションを表示できます。As you can see, the queue:work
job supports most of the same options available to queue:listen
. You may use the php artisan help queue:work
job to view all of the available options.
デーモンキューワーカー使用時のコーディング留意点Coding Considerations For Daemon Queue Listeners
デーモンキューワーカーは各ジョブを処理する前にフレームワークを再起動しません。そのため多くのリソースを使用するジョブを完了する前に、それらを開放するように気をつけてください。たとえばGDライブラリーを使用し画像処理を行う場合、完了したらimagedestroy
でメモリを開放する必要があるでしょう。Daemon queue workers do not restart the framework before processing each job. Therefore, you should be careful to free any heavy resources before your job finishes. For example, if you are doing image manipulation with the GD library, you should free the memory with imagedestroy
when you are done.
同様に、長時間動作するデーモンが使用し続ければデータベース接続は切断されるでしょう。新しい接続を行うためにDB::reconnect
メソッドを使う必要が起きるでしょう。Similarly, your database connection may disconnect when being used by a long-running daemon. You may use the DB::reconnect
method to ensure you have a fresh connection.
デーモンキューリスナーのデプロイDeploying With Daemon Queue Listeners
デーモンキューワーカーは長時間起動するプロセスですので、リスタートしなければコードの変更が反映されません。そのためデーモンキューワーカーを使用しているアプリケーションをデプロイする簡単な方法は、スクリプトをデプロイしている間にワーカーをリスタートすることです。デプロイスクリプトに以下のコマンドを含めることで、全スクリプトを穏やかにリスタートできます。Since daemon queue workers are long-lived processes, they will not pick up changes in your code without being restarted. So, the simplest way to deploy an application using daemon queue workers is to restart the workers during your deployment script. You may gracefully restart all of the workers by including the following command in your deployment script:
php artisan queue:restart
このコマンドは存在しているジョブが失われないように、現在のジョブの処理が終了した後に全キューワーカーを再起動するように穏やかに指示します。This command will gracefully instruct all queue workers to restart after they finish processing their current job so that no existing jobs are lost.
注意: このコマンドは再起動のスケジュールするため、キャッシュシステムを利用しています。デフォルト状態ではAPCuはCLIコマンドのために動作しません。APCuを使用する場合は
apc.enable_cli=1
をAPCu設定に追加してください。Note: This command relies on the cache system to schedule the restart. By default, APCu does not work for CLI jobs. If you are using APCu, addapc.enable_cli=1
to your APCu configuration.
失敗したジョブの処理Dealing With Failed Jobs
物事は計画通りうまく行かない場合もありますので、キュージョブが失敗することも想定できます。でも心配ありません。最高な人たちも失敗はするものです! Laravelは指定した回数ジョブを再実行する便利な方法を用意しています。この回数実行してもうまく行かない場合は、faild_jobs
テーブルに登録されます。失敗したジョブのテーブル名はconfig/queue.php
設定ファイルで指定できます。Since things don't always go as planned, sometimes your queued jobs will fail. Don't worry, it happens to the best of us! Laravel includes a convenient way to specify the maximum number of times a job should be attempted. After a job has exceeded this amount of attempts, it will be inserted into a failed_jobs
table. The name of the table can be configured via the config/queue.php
configuration file.
faild_jobs
テーブルのマイグレーションを生成するにはqueue:faild-table
コマンドを実行して下さい。To create a migration for the failed_jobs
table, you may use the queue:failed-table
command:
php artisan queue:failed-table
キューリスナーを実行時にqueue:listen
コマンドに--tries
スイッチを使い、ジョブの最大試行回数を指定することもできます。When running your queue listener[#running-the-queue-listener], you may specify the maximum number of times a job should be attempted using the --tries
switch on the queue:listen
command:
php artisan queue:listen connection-name --tries=3
ジョブ失敗イベントFailed Job Events
キュージョブが失敗した時に呼び出されるイベントのリスナーを登録したい場合は、Queue::failing
メソッドを使って下さい。このイベントはメールかHipChatであなたのチームに通知するのに便利でしょう。例としてLaravelに含まれているAppServiceProvider
にこのイベンのコールバックを追加してみましょう。If you would like to register an event that will be called when a queued job fails, you may use the Queue::failing
method. This event is a great opportunity to notify your team via e-mail or HipChat[https://www.hipchat.com]. For example, we may attach a callback to this event from the AppServiceProvider
that is included with Laravel:
<?php
namespace App\Providers;
use Queue;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの初期起動処理
*
* @return void
*/
public function boot()
{
Queue::failing(function ($connection, $job, $data) {
// ジョブが失敗したことをチームへ通知…
});
}
/**
* サービスプロバイダー登録
*
* @return void
*/
public function register()
{
//
}
}
ジョブクラスのfailedメソッドFailed Method On Job Classes
更に細かくコントロールするために、failed
メソッドをキュージョブクラスへ直接定義することもできます。ジョブが失敗した時に特定のジョブアクションを実行できるようにできます。For more granular control, you may define a failed
method directly on a queue job class, allowing you to perform job specific actions when a failure occurs:
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* ジョブの実行
*
* @param Mailer $mailer
* @return void
*/
public function handle(Mailer $mailer)
{
//
}
/**
* 失敗したジョブの処理
*
* @return void
*/
public function failed()
{
// ジョブが失敗した時に呼び出される…
}
}
失敗したジョブの再実行Retrying Failed Jobs
faild_jobs
データベーステーブルに挿入された、失敗したジョブを全部確認したい場合はqueue:failed
Arisanコマンドを利用します。To view all of your failed jobs that have been inserted into your failed_jobs
database table, you may use the queue:failed
Artisan command:
php artisan queue:failed
queue:failed
コマンドにジョブIDを指定すれば、接続、キュー、失敗した時間がリストされます。ジョブIDは失敗したジョブを再実行する場合にも使用します。たとえばIDが5の失敗したジョブを再実行するには、以下のコマンドを実行します。The queue:failed
command will list the job ID, connection, queue, and failure time. The job ID may be used to retry the failed job. For instance, to retry a failed job that has an ID of 5, the following command should be issued:
php artisan queue:retry 5
失敗したジョブをすべて再試行するには、queue:retry
でIDの代わりにall
を指定します。To retry all of your failed jobs, use queue:retry
with all
as the ID:
php artisan queue:retry all
失敗したジョブを削除するにはqueue:forget
コマンドを使います。If you would like to delete a failed job, you may use the queue:forget
command:
php artisan queue:forget 5
失敗したジョブを全部消去するにはqueue:flush
コマンドを使用します。To delete all of your failed jobs, you may use the queue:flush
command:
php artisan queue:flush