はじめに
前回の記事で、コマンドライン上からメール配信できるシステムができました。
EC2のLaravel6.0環境でメール配信コマンドを作成する AWS/Laravel連載(16)
確認ダイアログ挟まずメール配信できるオプションを追加する
前回の記事ではメール配信時にyes/noの確認を挟んでいました。
Cron実行しようとするとその機能は少々邪魔なので、確認挟まず送信するオプションを用意しましょう。
...
- protected $signature = 'email:send {user : ユーザーIDを指定}';
+ protected $signature = 'email:send {user : ユーザーIDを指定} {--f : 確認を挟まず送信する}';
...
- if ($this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか?')) {
+ if ($this->option('f') || $this->confirm($user->name . 'さん[' . $user->email . ']にメールを配信しますか?')) {
...
これだけです。
{--hoge}はオプションです。
指定されていないときはfalse、指定された時はtrueが返ります。
なので普通に
$ php artisan email:send 1
と実行した場合は今まで通りの挙動になります。
そして
if ($this->option('f') ||
としたことにより、オプション --fが指定された場合は確認挟まずメール配信が実行されます。
$ php artisan email:send 1 --f
crontabの設定
レガシーなWebフレームワークだと、コマンド一個一個をCronに登録していました。
Laravelではタスクスケジューラが標準搭載されているので、crontabに1行追加するだけで、あとは全てPHPのコード上で実装できます。
メリットとしては、
- Cronに1行で済むのですっきりする
- 環境によってはCronがバージョン管理されていないこともあり、直接操作はリスクが大きい。その問題をほぼ解消できる
- 本番環境におけるCronの追加・削除忘れ等が起きづらく、コマンド追加したバージョンがデプロイされると同時にタスクスケジュールがセットされる
- コマンドのタスク開始時やタスク終了時にフックができるので、コマンド実行順を担保したい場合にコード上だけで実行できる
- その他バックグラウンド実行やメンテ時の挙動等、複雑な挙動をミドルウェア入れずともフレームワーク標準機能で実現できる
といったところでしょうか。他にもありそうです。
さて、早速設定します。
$ crontab -e
* * * * * cd /var/www/blog && php artisan schedule:run >> /dev/null 2>&1
cronは分 時 日 月 曜日の順なので、そこが全て*になっています。
つまり「毎分毎時毎日毎月毎曜日」=1分ごとに常にアプリケーションのパスに移動しスケジュールを実行、ということですね。
Laravel側の対応
既にタスクスケジュール用のファイルはあるので、一行追加するだけです。
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
+ $schedule->command('email:send 1 --f')->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
これを実行すると、毎分メールが届くようになります。
さすがに邪魔なので、動作確認できたらコメントアウトしておきましょう。
今回は以上です。