フレームワークによってはコントローラーを直接CLIから叩けるものもありますが、 Laravelの場合はコマンドを用意する必要があるようです。 (とはいえ artisan コマンドが用意されているので簡単です。)
コマンド名は
make:auth
make:migration
のように(makeグループの中のauth)みたいな感じで、グルーピングされていますので、
自作コマンドもグルーピングしておくと、コマンドが増えた時に一覧表示で見やすくなります。
今回作成するコマンドは
myapp:print
とします。
myapp:print コマンドを作成する時には次のように入力します
php artisan make:command MyappPrint
するとファイル app/Console/Commands/MyappPrint.php が自動生成されます。
app/Console/Commands/MyappPrint.php を以下のようにします
protected $signature = 'myapp:print'; にコマンド名をセットします。
protected $description = 'MYAPP:にコマンドの説明をセットします。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MyappPrint extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'myapp:print';
/**
* The console command description.
* @var string
*/
protected $description = 'MYAPP: ハローと表示します';
/**
* Create a new command instance.
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
// ここにロジックを記述
echo 'Hello Myapp Command !!!' . "\n";
}
}
php artisan myapp:print
結果
Hello Myapp Command !!!
protected $signature = 'myapp:print';
↓
protected $signature = 'myapp:print {id}';
と変更します。
「引数なし」を許可するには
protected $signature = 'myapp:print {id?}';
とします。
public function handle()
{
// ここにロジックを記述
$id = $this->argument('id');
echo 'Hello Myapp Command !!!' . "\n";
echo $id;
}
ターミナルから実行時に引数を渡します
php artisan myapp:print
Laravel で定期実行させるにはまず cron で毎分ごとにLaravelのスケジューラを実行させ、その中でLaravelで設定した時間ごとにコマンドを自動実行します。
crontab -e
crontabの書式に沿って以下のように記述します
* * * * * php7 /YOUR/APP/PATH/artisan schedule:run >> /dev/null 2>&1
コマンド「myapp:getdata」を1分ごとに起動するように設定します。
protected function schedule(Schedule $schedule)
{
// RSSからデータを取得 (1分ごと)
$schedule->command('myapp:getdata')->everyMinute();
}
以上です。 ログを見て定期実行が行われているか確認します。
スケジュールは以下のように設定できます。
メソッド | 説明 |
---|---|
->cron('* * * * * *'); |
CRON記法によるスケジュール |
->everyMinute(); |
毎分タスク実行 |
->everyFiveMinutes(); |
5分毎にタスク実行 |
->everyTenMinutes(); |
10分毎にタスク実行 |
->everyFifteenMinutes(); |
15分毎にタスク実行 |
->everyThirtyMinutes(); |
30分毎にタスク実行 |
->hourly(); |
毎時タスク実行 |
->hourlyAt(17); |
一時間ごと、毎時17分にタスク実行 |
->daily(); |
毎日深夜12時に実行 |
->dailyAt('13:00'); |
毎日13:00に実行 |
->twiceDaily(1, 13); |
毎日1:00と13:00時に実行 |
->weekly(); |
毎週実行 |
->monthly(); |
毎月実行 |
->monthlyOn(4, '15:00'); |
毎月4日の15:00に実行 |
->quarterly(); |
四半期ごとに実行 |
->yearly(); |
毎年実行 |
->timezone('America/New_York'); |
タイムゾーン設定 |
cronでコマンドが呼ばれているかを確認するには
php artisan schedule:run
としますが、あらかじめ メソッドの修正が必要です!(重要)
1分に変更しないと、No scheduled commands are ready to run. が出て終了してしまいます。
また、重複起動を回避するメソッド withoutOverlapping() も外しておきましょう。
protected function schedule(Schedule $schedule)
{
$schedule->command('myapp:getdata')->everyMinute();
php artisan schedule:run
とします。
これで必ず設定されたタスクが走るので、ログを見て動作を確認します。
どうやら withoutOverlapping() はデッドロックを自動で解除できないようです。