LaravelのQueuesをレンタルサーバーで実装する

高負荷で大量な処理を都度実行する際には 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 の実行ができるようになりました。

お疲れ様でした。