Laravelのジョブ、キュー、ワーカー、そしてcronの活用
Laravelは、非同期処理を簡単に実装できるキューシステムを提供している。長時間かかるタスクや非同期で実行したい処理を効率的に管理するために、ジョブとキュー、ワーカーの仕組みを使う。また、cronを使用してスケジュールされたタスクを自動化することも可能だ。
ジョブ(Job)とは?
ジョブは、実行するタスクや処理の単位を表す。たとえば、メールの送信、ファイルの処理、外部APIへのリクエストなどのタスクをジョブとして定義できる。
ジョブの作成
新しいジョブを作成するには、php artisan make:job
コマンドを使う。
php artisan make:job SendEmailJob
このコマンドを実行すると、app/Jobs/SendEmailJob.php
というファイルが作成される。ジョブクラスの中でhandle
メソッドを定義し、タスクを実行するロジックを記述する。
例: メール送信ジョブ
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Mail;
class SendEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $emailDetails;
public function __construct($emailDetails)
{
$this->emailDetails = $emailDetails;
}
public function handle()
{
Mail::to($this->emailDetails['email'])->send(new \App\Mail\SampleMail($this->emailDetails));
}
}
キュー(Queue)とは?
キューは、ジョブを非同期に実行するための待機リストだ。ジョブはキューに投入され、ワーカーが順次処理する。これにより、リクエストの応答時間を短縮できる。
キュー用のテーブル作成
データベースドライバを使用する場合は、ジョブを管理するためのテーブルを作成する必要がある。
php artisan queue:table
php artisan migrate
これで、jobs
テーブルが作成され、キューに投入されたジョブが管理される。
ワーカー(Worker)とは?
ワーカーは、キューに投入されたジョブを処理するためのプロセスだ。ワーカーは指定されたキューからジョブを取り出し、順次実行していく。
ワーカーの起動
ワーカーを起動するには、queue:work
コマンドを使う。
php artisan queue:work
-
バックグラウンドで実行: ワーカーをバックグラウンドで実行するには、
supervisor
などのプロセスマネージャを使用するのが一般的。
失敗したジョブの管理
ジョブが失敗した場合、その情報を保存するためのテーブルを作成できる。これにより、後で失敗したジョブを再試行したり、エラーの原因を調査したりできる。
失敗したジョブ用のテーブル作成
php artisan queue:failed-table
php artisan migrate
これで、failed_jobs
テーブルが作成される。失敗したジョブはこのテーブルに記録される。
失敗したジョブの確認
失敗したジョブを確認するには、次のコマンドを使う。
php artisan queue:failed
失敗したジョブの再試行
失敗したジョブを再試行するには、次のコマンドを使う。
php artisan queue:retry {id}
- {id}: 失敗したジョブのIDを指定する。
失敗したジョブを削除
失敗したジョブを削除するには、次のコマンドを使う。
php artisan queue:forget {id}
- {id}: 削除するジョブのIDを指定する。
また、すべての失敗したジョブを削除するには、次のコマンドを使う。
php artisan queue:flush
cron(クーロン)とは?
cron
は、スケジュールされたタスクを指定した時間に自動で実行するためのLinuxサービスだ。Laravelでは、cron
を使って定期的にジョブをキューに投入したり、スケジュールされたタスクを実行できる。
cronサービスの制御
-
サービスの停止:
service cron stop
-
cron
サービスを停止する。これにより、すべてのスケジュールされたタスクの実行が一時的に停止する。
-
-
サービスの開始:
service cron start
-
cron
サービスを開始する。スケジュールされたタスクの実行が再開される。
-
-
サービスの再起動:
service cron restart
-
cron
サービスを再起動する。設定の変更後に反映させるために使われる。
-
cronを設定してLaravelのタスクを実行
cron
にスケジュールを設定して、Laravelのスケジューラを毎分実行するようにする。
* * * * * php /path/to/your/project/artisan schedule:run >> /dev/null 2>&1
-
* * * * *
: 毎分実行する設定。 -
php /path/to/your/project/artisan schedule:run
: Laravelのスケジュールされたタスクを実行するコマンド。
まとめ
- ジョブ: 非同期に実行したいタスクを定義する。
-
キュー: ジョブを順番に処理する待機リスト。
jobs
テーブルで管理。 -
失敗したジョブ:
failed_jobs
テーブルで失敗したジョブを記録・管理し、再試行や削除が可能。 - ワーカー: キューからジョブを取り出し実行するプロセス。
- cron: スケジュールされたタスクを自動実行するためのサービス。Laravelのスケジューラと組み合わせて使用する。
これらを組み合わせることで、長時間かかる処理を非同期で実行し、定期的なタスクを自動化することができる。