1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel6.x】 子分を雇って使役する方法(スケジューラーとキューワーカー)

Last updated at Posted at 2021-02-03

人気ランキングの集計や月間売上の集計とかをしなきゃ!

でも、お客(ユーザー)がひっきりなしに来ている状態でお店(サーバー)を休めない!

変わりのお店(サーバー)を用意できればいいですけど、
お金がもったいないときは子分(キューワーカー)を雇って使役しちゃいましょう。

スケジューラーを使えば、必要なタスク(集計とか)を定期的に追加できるので便利です。

キューワーカーの準備

キューワーカーは、子分です(雑)。

タスクを登録した順(First In First Out)で順番にこなしてくれるカワイイやつです。
ぜひこき使いましょう!

# 以下を.envに追記 (キューをデータベースを使って管理する設定)
QUEUE_CONNECTION=database
QUEUE_DIRVER=database

# キュー管理用のテーブル作成
php artisan queue:table
php artisan migrate

# ワーカーの起動 (起動したプロセスを維持する必要あり)
php artisan queue:work

キューワーカーの準備(本番環境)

本番でワーカーを起動しっぱなしにするには、Supervisiorを使いましょう。
参考:https://readouble.com/laravel/6.x/ja/queues.html#supervisor-configuration

ジョブを作成

子分にこなしてもらうジョブ(タスク)を作りましょう!

例として、ランキング作成と売上集計するジョブ、、、はめんどくさいので、単にログってくれるものを作ります。

// Jobの雛形を作成
php artisan make:job RankingCulculatingJob

// app/Jobs/RankingCulculatingJob.php
    ...
    public function handle()
    {
        \Log::info('ランキング計算したよ!');
    }

// もう一つ売上集計ジョブを作成
php artisan make:job SalesCulculatingJob

// app/Jobs/SalesCulculatingJob.php
    ...
    public function handle()
    {
        \Log::info('売上計算したよ!');
    }

スケジューラーの準備

Laravelのartisanコマンドにschedule:runがあります。

こいつをCronで毎分実行するようにすると、app/Console/Kernel.phpの設定通りにタスクを実行してくれます。

そのためCronの設定ファイルを編集します。

# 以下のコマンドを実行
crontab -e

# 以下のように編集
* * * * * php 【あなたのプロジェクトフォルダ】/artisan schedule:run >> /dev/null 2>&1

スケジューラーにジョブを登録

app/Console/Kernel.phpに実行したいジョブを登録していきます。

...
protected function schedule(Schedule $schedule)
{
    $schedule->job(new RankingCulculatingJob)->everyMinute();
    $schedule->job(new SalesCulculatingJob)->everyMinute();
}

必要なのはこれだけ!!!!!

動作確認!

php artisan queue:workを実行したプロセスをみるとこんな感じ!

[2021-02-03 16:31:09][2] Processing: App\Jobs\SalesCulculatingJob
[2021-02-03 16:31:09][2] Processed:  App\Jobs\SalesCulculatingJob
[2021-02-03 16:32:03][3] Processing: App\Jobs\RankingCulculatingJob
[2021-02-03 16:32:03][3] Processed:  App\Jobs\RankingCulculatingJob
[2021-02-03 16:32:03][4] Processing: App\Jobs\SalesCulculatingJob
[2021-02-03 16:32:03][4] Processed:  App\Jobs\SalesCulculatingJob
[2021-02-03 16:33:03][5] Processing: App\Jobs\RankingCulculatingJob
[2021-02-03 16:33:03][5] Processed:  App\Jobs\RankingCulculatingJob
[2021-02-03 16:33:03][6] Processing: App\Jobs\SalesCulculatingJob
[2021-02-03 16:33:03][6] Processed:  App\Jobs\SalesCulculatingJob

Logが毎分増えていく!

// ログ監視を開始する
tail -f storage/logs/laravel.log

[2021-02-03 16:31:09] local.INFO: ランキング計算したよ
[2021-02-03 16:31:09] local.INFO: 売上計算したよ
[2021-02-03 16:32:03] local.INFO: ランキング計算したよ
[2021-02-03 16:32:03] local.INFO: 売上計算したよ
[2021-02-03 16:33:03] local.INFO: ランキング計算したよ
[2021-02-03 16:33:03] local.INFO: 売上計算したよ
[2021-02-03 16:34:00] local.INFO: ランキング計算したよ
[2021-02-03 16:34:00] local.INFO: 売上計算したよ
[2021-02-03 16:35:03] local.INFO: ランキング計算したよ
[2021-02-03 16:35:03] local.INFO: 売上計算したよ

※エラーが出る場合

The server requested authentication method unknown to the client

スケジューラー経由のジョブ登録時に↑のようなDB接続問題が出ましたが、以下の記事にある方法で解消できました!

参考記事 : macでLaravelでmysql8を使う (mysql8の認証プラグインの変更) - Qiita

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?