プロミディア合同会社の斉藤です。
Webサイトによくあるランキング機能ですが、あれはランキング画面を開いた時に計算しているのではありません。
Webサーバ側で決めた一定の周期でランキング計算をし、その結果をランキングテーブルに格納し、ランキング画面ではそのデータを表示させています。
今回はLaravelでランキング集計処理を定期的に実行する方法について解説していきます。
集計処理の全体像
集計処理の実装は大きく分けて3つの工程を行います。
・定期的に実行させる設定の追加
・Laravelプロジェクト内でのスケジュール定義
・ランキング集計処理の実装
定期的に実行させる設定の追加
定期的に処理を実行させるにはWebサーバ側にもクーロンの設定が必要となります。
クーロン設定を開く
1 |
$ crontab -e |
Cronエントリを追加する
1 |
* * * * * cd /Users/sada/php/summarysample && php artisan schedule:run >> /dev/null 2>&1 |
Laravelプロジェクト内でのスケジュール定義
Kernelクラスのscheduleメソッド内に定期実行したい処理を記述します。
今回は自分で作成したランキング集計用クラス(DaySummary)のrunSummaryメソッドを呼び出すように書きました。
App/Console/Kernel.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function() { $daySummary = new DaySummary; $daySummary->runSummary(); })->daily(); } |
daily()を指定すると「毎日深夜12時」に実行します。
毎日の実行時間を指定したい場合は「->dailyAt(’13:00′);」のようにして、任意の時刻に設定することもできます。
また、時刻指定の他に
毎分→「->everyMinute();」
30分毎→「->everyThirtyMinutes();」
といった指定方法も用意されています。
ランキング集計処理の実装
集計処理自体はそれ用のクラスに記述します。
集計処理ではいつ呼ばれたかは意識せず、呼ばれたら常に集計の仕様に沿って処理を行わせます。
※現状は呼ばれたら1行登録するだけの実装です。まだ集計処理のロジックにはしていません。
app/Bat以下にDaySummaryクラスを作成しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Bat; use App\Daydata; class DaySummary { public function runSummary() { //処理内容はまだ適当に書いてある $dayData = new Daydata; $dayData->content = 'aaa'; $dayData->save(); } } |
まとめ
Laravelでは定期実行の仕組みも用意されています。
最初にCrontabに1行設定してしまえば、あとはWebアプリ側で柔軟な設定が可能ですので、今回のやり方を参考にしてみてください。