イントロダクション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