Laravelで非同期Jobのサンプルを見ると、色々と登場人物が出てきてよくわからないので整理する。 サンプルで出てくるコードはLaravel7あたりです。
<?php namespace App\Jobs; use App\AudioProcessor; use App\Podcast; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; 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) { // アップロード済みポッドキャストの処理… } }
ShouldQueueインターフェイス=非同期実行
インターフェイスとしては何も定義していないが、非同期実行のために必要。
// src/Illuminate/Bus/Dispatcher.php public function dispatch($command) { return $this->queueResolver && $this->commandShouldBeQueued($command) ? $this->dispatchToQueue($command) : $this->dispatchNow($command); }
Dispatchable トレイト
Dispatchable トレイトを使用することで、ジョブクラスから直接ジョブをディスパッチ(送信)する便利なメソッドが提供されます。具体的には、ジョブクラスに Dispatchable トレイトを使用すると、そのジョブクラスのインスタンスを作成せずに dispatch メソッドを直接呼び出すことができます。
dispatch(new ExampleJob());
こうではなく。
ExampleJob::dispatch();
こう書ける。
Chat-GPTより。
実装を見ると、dispatch()
, dispatchIf()
, dispatchUnless()
, broadcast()
があるが、dispatch()
しか知らない。
InteractsWithQueue
キューにプッシュされるジョブがキューとやりとりするためのメソッドを提供します。具体的には、このトレイトはジョブが自分自身をキューから削除したり、リリースしたり、タイムアウトを設定したりするための機能を持っています。
Chat-GPTより。
Queueable
ジョブやリスナーにキュー関連の操作やプロパティを追加することができます。
Chat-GPTより。
キューの指定(onQueue())だったり、実行の遅延(delay)だったりの機能提供。
SerializesModels
キューにプッシュされる際に、Eloquentモデルを適切にシリアライズするため。
その他
WithoutOverlapping: 同じジョブが同時に複数回実行されるのを防ぐためのトレイトです。例えば、特定のジョブが長時間かかる場合や、次の実行が前の実行が完了する前に開始される可能性がある場合に使用します。 WithTimestamps (Laravel 8.x 以降): ジョブがキューに追加されたタイムスタンプと、ジョブが最後に実行されたタイムスタンプを追跡します。 ShouldBeUnique (Laravel 8.x 以降): ジョブが一度に1つだけキューにあることを保証します。これは、データベースの整合性を保つためや、同じ操作が複数回実行されるのを防ぐために役立ちます。
Chat-GPTなんでも答えてくれるな。すごい。