laravel5.1で日時バッチを作ってみた。
「年齢で何歳以上」とか「勤続10年以上」みたいな検索をしたい時は、SQLで計算するよりも専用カラムを用意してWhere句で指定できた方が楽。
たた、MySQLなどはリアルタイムで値が計算されるような機能って無さそう…。
一日に一回更新すれば充分だから、日時バッチで計算する事で対応しよう。
参考URL:http://qiita.com/ritukiii/items/a70d89fa988b2d9afbc4
php artisanに追加コマンド(追加オプション?)が生成できるらしい。
php artisan make:console クラス名 –command=”コメンド名”
1 2 3 |
# php artisan make:console DailyCalc --command="dailycalc" php artisan make:command DailyCalc --command="dailycalc" Console command created successfully. |
app/Console/Commands/DailyCalc.phpが生成された!
とりあえず、hello, worldと出力する処理を、handleメソッドに追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class DailyCalc extends Command { // コマンド名 protected $signature = 'dailycalc'; // コマンドの説明 protected $description = 'Command description'; // 初期化処理 public function __construct() { parent::__construct(); } // コマンドを叩かれた時の処理 public function handle() { print "hello, world"; // とりあえずは、お約束のフレーズを追加! } } |
これだけでは動かなくて、app/Console/Kernel.phpに、自作コマンドのパスを追加する必要がある
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { protected $commands = [ \App\Console\Commands\Inspire::class, \App\Console\Commands\DailyCalc::class, // 日時バッチを追加! ]; protected function schedule(Schedule $schedule) { $schedule->command('inspire') ->hourly(); } } |
ここまでやれば、コマンドから実行可能になる!
1 2 |
php artisan dailycalc hello |
肝心要の日時バッチは例によってcrontabを使う。
laravelでは1行だけ記述して毎分コールしてもらう。そして、内部コーディングを使ってどのタイミングで、どんなコマンドを実行するか決定するらしい。
1 |
* * * * * php /path/to/project/artisan schedule:run 1>> /dev/null 2>&1 |
さっき独自コマンドを登録したapp/Console/Kernel.phpに記述する。
1 2 3 4 5 6 7 8 9 |
protected function schedule(Schedule $schedule) { $schedule->command('inspire') ->hourly(); // 毎日決まった時間(零時一分)にバッチが実行される $schedule->command('dailycalc') ->dailyAt('0:01'); } |
公式HPをみると、わりと色々な指定がある。年一とか忘れてそうだ(^_^;)
https://laravel.com/docs/master/scheduling
1 2 3 4 5 6 7 8 9 10 11 12 13 |
->everyMinute(); // 毎分 ->everyFiveMinutes(); // 5分毎 ->everyTenMinutes(); // 10分毎 ->everyThirtyMinutes(); // 30分毎 ->hourly(); // 毎時 ->daily(); // 毎日(深夜って書いてあるけど、いつ?) ->dailyAt('13:00'); // 指定した時分 ->cron('* * * * * *'); // crontab形式 ->twiceDaily(1, 13); // 毎日2回だけ指定した時間(1:00 と13:00) ->weekly(); // 週一 ->monthly(); // 月一 ->monthly(4, '15:00'); // 月一の日時を指定。毎月4日の15時 ->yearly(); // 年一 |
完成形(年齢・勤続年数の更新処理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use App\User; class DailyCalc extends Command { // コマンド名 protected $signature = 'dailycalc'; // コマンドの説明 protected $description = 'Command description'; // 初期化処理 public function __construct() { parent::__construct(); } // コマンドを叩かれた時の処理 public function handle() { // 全員が対象 $users = User::all(); $cnt = 0; foreach ($users as $user) { //年齢計算 $from = new \DateTime($user['birthday']); $to = new \DateTime('today'); $user['age'] = $from->diff($to)->y; // 入社日から、勤続年数を算出する $nowDate = new \Datetime(); $tomorrowDate = $nowDate->modify("1 day"); $interval = $tomorrowDate->diff(new \DateTime( $user['hire_date'] )); $user['length_hire_date'] = $interval->format('%y年%mヶ月%d日目'); // テーブル更新 $user->save(); $cnt++; } // storage/logs/laravel.logに保存される(config/app.phpによる) \Log::info('daily batch', ['updated',$cnt]); } } |