人気ランキングの集計や月間売上の集計とかをしなきゃ!
でも、お客(ユーザー)がひっきりなしに来ている状態でお店(サーバー)を休めない!
変わりのお店(サーバー)を用意できればいいですけど、
お金がもったいないときは子分(キューワーカー)を雇って使役しちゃいましょう。
スケジューラーを使えば、必要なタスク(集計とか)を定期的に追加できるので便利です。
キューワーカーの準備
キューワーカーは、子分です(雑)。
タスクを登録した順(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接続問題が出ましたが、以下の記事にある方法で解消できました!