参考
キュー 6.x Laravel
https://readouble.com/laravel/6.x/ja/queues.html
ワーカの起動方法
workとlistenの2種類がある。
queue:work
キューワーカは長時間起動するプロセスで、メモリ上にアプリケーション起動時の状態を保存していることを記憶にとどめてください。そのため、開発段階ではキューワーカの再起動を確実に実行してください。付け加えて、アプリケーションにより生成、もしくは変更された静的な状態は、ジョブ間で自動的にリセットされないことも覚えておきましょう。
デーモンキューワーカは各ジョブを処理する前に、フレームワークを「再起動」しません。そのため、各ジョブが終了したら、大きなリソースを開放してください。たとえば、GDライブラリでイメージ処理を行ったら、終了前にimagedestroyにより、メモリを開放してください。
キューワーカは長時間起動プロセスであるため、リスタートしない限りコードの変更を反映しません。ですから、キューワーカを使用しているアプリケーションをデプロイする一番シンプルな方法は、デプロイ処理の間、ワーカをリスタートすることです。queue:restartコマンドを実行することで、全ワーカを穏やかに再起動できます。
通常のワーカを立ち上げる。
queue:listen
と違いフレームワークを再起動しないため、デプロイ後はワーカを再起動しない限り、古いコードが動き続けてしまう。
また、完全にメモリを開放しないため、コードの内容によってはメモリリークが発生する可能性がある。
ワーカ再起動にはqueue:restart
を使う。
これはgraceful restartであり、ワーカは既存のジョブが完了したタイミングで再起動される。
queue:listen
queue:listenコマンドを使えば更新したコードをリロード、もしくはアプリケーションの状態をリセットしたい場合に、手動でワーカをリスタートする必要がなくなります。しかし、このコマンドはqueue:workほど効率はよくありません。
1ジョブごとにフレームワークを再起動するワーカを立ち上げる。
ジョブごとにメモリが開放され、コードが再読み込みされるため安心。
ただし、オーバーヘッドが大きい。
ワーカの終了方法
デフォルト
queue:work Artisanコマンドを使いワーカを実行できます。queue:workコマンドが起動したら、皆さんが停止するか、ターミナルを閉じるまで実行し続けることに注意してください。
ジョブが無くてもワーカは動き続ける。
例) php artisan queue:work
once
--onceオプションは、ワーカにキュー中のジョブをひとつだけ処理するように指示します。
1つのジョブを実行した後にワーカを終了する。
例) php artisan queue:work --once
stop-when-empty
--stop-when-emptyオプションは、すべてのジョブを処理してから終了するように、ワーカへ指示するために使用します。
全てのジョブを実行した後にワーカを終了する。
例) php artisan queue:work --stop-when-empty
ジョブの排他制御方法
Cron タスクスケジューラの onOneServer() と withoutOverlapping() の違い を読む