1
2

More than 3 years have passed since last update.

EC2のLaravel6.0環境でメールを定期配信するタスクスケジューラを作成する AWS/Laravel連載(17)

Posted at

はじめに

前回の記事で、コマンドライン上からメール配信できるシステムができました。

EC2のLaravel6.0環境でメール配信コマンドを作成する AWS/Laravel連載(16)

確認ダイアログ挟まずメール配信できるオプションを追加する

前回の記事ではメール配信時にyes/noの確認を挟んでいました。
Cron実行しようとするとその機能は少々邪魔なので、確認挟まず送信するオプションを用意しましょう。

app/Console/Commands/SendEmails.php
...
-    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のコード上で実装できます。

Laravel 6.0 タスクスケジュール

メリットとしては、

  • Cronに1行で済むのですっきりする
  • 環境によってはCronがバージョン管理されていないこともあり、直接操作はリスクが大きい。その問題をほぼ解消できる
  • 本番環境におけるCronの追加・削除忘れ等が起きづらく、コマンド追加したバージョンがデプロイされると同時にタスクスケジュールがセットされる
  • コマンドのタスク開始時やタスク終了時にフックができるので、コマンド実行順を担保したい場合にコード上だけで実行できる
  • その他バックグラウンド実行やメンテ時の挙動等、複雑な挙動をミドルウェア入れずともフレームワーク標準機能で実現できる

といったところでしょうか。他にもありそうです。

さて、早速設定します。

$ crontab -e
crontab
* * * * * cd /var/www/blog && php artisan schedule:run >> /dev/null 2>&1

cronは分 時 日 月 曜日の順なので、そこが全て*になっています。
つまり「毎分毎時毎日毎月毎曜日」=1分ごとに常にアプリケーションのパスに移動しスケジュールを実行、ということですね。

Laravel側の対応

既にタスクスケジュール用のファイルはあるので、一行追加するだけです。

app/Console/Kernel.php
<?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');
    }
}

これを実行すると、毎分メールが届くようになります。
さすがに邪魔なので、動作確認できたらコメントアウトしておきましょう。

今回は以上です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2