高負荷で大量な処理を都度実行する際には job/queue の実装を検討するのですが、レンタルサーバーではワーカーの立ち上げが出来ません。
ワーカープロセスを立ち上げる外部サーバーやAWSやGCPなどを組み合わせる方法もありますが、あくまでレンタルサーバーのみで完結する方法が実装できたのでメモしておきます。
Queuesの仕組みなどは公式のドキュメントを参照してください
https://laravel.com/docs/9.x/queues
Laravel バージョン 9.41 で確認しました。
設定するポイント
レンタルサーバーでQueuesを実行するポイントとしては以下があります
- ドライバはDatabaseに設定して、レンタルサーバー内のMySQLにキューを格納
- cronであらかじめ
php artisan schedule:run
を毎分実行するように設定しておく - cronでワーカーを50秒間立ち上げる
前提条件としては Laravel プロジェクト内で queue:work
を実行すれば蓄積されたキューを適時実行してくれます。
本来であれば常時プロセスとして Supervisor などで起動するのですが、レンタルサーバーでは常時プロセスを立ち上げるのは好ましくないので
- ワーカーを最大で50秒間実行する
- キューがなければ終了
を実現する queue:work
のオプションを記載してcronで毎分実行する方針です。
(もっといい方法があれば教えてもらえるとありがたいです)
実際の設定方法
レンタルサーバーのみで実行するため、Databaseドライバを使用します
QUEUE_CONNECTION=database
テーブルの作成を実行
php artisan queue:table
php artisan migrate
php artisan make:job
を使用してJob Classを作成したのち、ワーカーの起動を以下のように設定しました。
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('queue:work --stop-when-empty --queue=high,default --sleep=3 --tries=3 --max-time=50')->everyMinute();
}
以上でレンタルサーバーのみで job/queue の実行ができるようになりました。
お疲れ様でした。
コメントを残す