2019/11/08Laravelのタスクスケジュール(cron)を使いこなすLaravel上のテーブルに保存されたデータから日々の売上の集計を行いたい、Laravelの関連ファイルのバックアップを行いたいなど、定期的に決められた処理を自動的に実行したい場合にタスクスケジュールを利用すると簡単に実装することができます。通常Unix/Linux系のOSを使用している場合に定期的な処理を行いたい場合はCronを利用し、実行したいタスク毎にエントリー(ジョブの登録)を追加していきます。LaravelもCronを利用していますがLaravelのタスクスケジュールを設定する場合は、Cronへのエントリーを1つ加えるだけでタスク毎にCronへのエントリーを追加する必要がありません。各タスク処理はLaravel側で行うため、タスクの追加・削除を効率よく行うことができます。保存したファイルをメールで送信Cronの理解Laravelのタスクスケジュールの実行にはCronが利用されているので、まずCronとはなにかとCronの設定方法を確認しておきます。CronとはLinux/Unix系OSでは、ある特定の処理を定期的に実行したい場合にCronを利用します(MACでも利用可能です)。Table)にエントリーを記述することでエントリーの内容に沿って定期的に処理を行うことができます。Table)の書式crontabのエントリーの記述方法にはルールがあり下記の書式にしたがって記述する必要があります。左の*(アスタリスク)は分、2つ目は時間、3つ目は日時、4つ目は月の設定、5つ目は曜日の設定を行います。commandcommandに実行したい処理を記述します。各*(アスタリスク)には下記の数値を指定することができます。※0は日曜日cronのコマンドcronで使用するコマンドは下記の通りです。1等のメッセージが出力され保存することができません。-eを実行してください。crontabが表示されれば保存可能となります。-eコマンドを実行します。-lコマンドで確認することができます。毎分特定の処理を行い場合はすべてを*にします。command毎時10分に特定の処理を行いたい場合は下記のように記述します。0:10、1:10、2:10...で実行されます。command毎朝8:00に特定の処理を行いたい場合は下記ように記述します。command月曜日の朝8:00に処理を行いたい場合は下記のように記述します。実際にcronにエントリーを追加して動作確認を行ってみましょう。/Users/reffect/cron.log上記を設定するとreffectユーザのホームディレクトリである/Users/reffectの下にcron.logが作成され、cron.logファイルが作成されます。このようにcronは書式さえ理解できれば簡単に定期処理を行うことができます。cronの設定がわかったので、cronを利用するLaravelのタスクスケジュールの設定方法を確認していきます。Laravelのタスクスケジュールの設定Laravelのタスクスケジュールはapp/Console/Kernel.phpファイルの中に記述します。タスクを実行する方法にはCommand(コマンド)を利用した方法、Closure(クロージャー)を利用した方法、直接コマンドを利用した方法などいくつかあります。本文書では1つ1つ設定方法を確認しておきます。app/Console/Kernel.phpファイルのデフォルトの中身は下記のようになっています。}}Cronへの登録Laravelのタスクスケジュールを設定するためには、cronに必ず下記の1行を追加しておく必要があります。-eコマンドで追加してください。2>&1path-to-your-projectはLaravelをインストールしたディレクトリを設定してください。各自の環境により異なる値になります。schedule:runが実行されます。Laravelでタスクスケジュールを追加している場合は、scheduleを経由して登録されたタスクが設定された時刻に実行されます。Commandとはapp/Console/Kernel.phpファイル内の各所にCommandという単語がいくつも記述されています。Commandって何?と思われた方も多いかと思いますがCommandという単語を意識することなくLaravelを使ったことがある人は知らず知らずのうちに利用しています。migrateのmigrateもCommandの一つです。listコマンドで確認することができます。environment複数のCommandが事前に登録されていますが、自分でCommandを作成・登録することができます。作成したCommandは、タスクスケジュールで利用することができます。make:commandで作成することができます。動作確認のためWriteLogというCommandを作成します。successfully.作成されたWriteLogはapp¥Console¥Commandsの下に作成されます。中身を下記のようになっています。handle()を設定していきます。$signatureはCommandの名前の入力します。Commandを実行する際に利用します。:(コロン)で分けることでグループ化することができます。グループ化等についてはCommandを登録した後の確認で説明します。ここでは$signatureを下記のように設定を行います。'writelog:info';$descriptionにはCommandの説明を記述します。file';handle()には実行したい処理内容を記述します。loggerのヘルパー関数を仕様してinfoレベルのメッセージをログファイルに書き込むだけのシンプルな処理内容です。Command.');}Commandの作成は完了しましたが、Commandを作成しただけでは実行することができません。Commandを実行するためには、Commandの登録が必要になります。Commandの登録Commandの登録はapp¥Console¥Kernel.phpで行います。デフォルトでは何も設定されていない状態ですが$commands変数に作成したCommandの情報を登録します。Commandを追加します。listコマンドを実行するとKernel.phpに登録したWritelogの情報が表示されます。$signatureで入力した名前と$descriptionで入力した説明もここに表示されます。listを実行してもCommandは表示されます。listコマンドを実行すると表示されますが、表示される位置が異なります。Commandでは先頭のほうに表示、Command:nameではグループの名前にソートされアルファベット順になるので、writelogのグループ名では最後に表示されます。artisanを使用して実行してみましょう。writelogo:info実行するとstorage/logs/の下にあるログファイルに下記のメッセージが追加されます。Command.タスクスケジュールへの登録Commandが単独で動作することが確認できたので、定期的にCommandが実行されるようにスケジュールへの登録を行います。登録はKernel.phpファイルで行います。動作確認なので毎分実行させるためにscheduleメソッドの中に下記のように記述します。everyMinuteをつけることで毎分実行することができます。->everyMinute();}登録後に毎分ログファイルの中にinfoメッセージが登録されれたタスクスケジュールへの登録が正常に行われたことになります。ログを見ると1分毎にログに書き込まれています。Command.クロージャーを利用した方法ここまではCommandを利用しましたが、クロージャーを使っても同じことを実行することができます。Kernel.phpファイルにcallメソッドを使ってクロージャーを記述します。Closure');});毎分ログファイルに上記のinfoメッセージが追加されます。Closureシェルコマンドを利用した方法シェルコマンドを利用する場合は、execメソッドを使用します。動作確認なので、touchコマンドを利用して空ファイルの作成を行うタスクを追加します。->everyMinute();指定したディレクトリの中にnew_file.txtファイルが作成されます。処理結果をファイルに保存タスクスケジュールを実行した内容を保存するためにsendOutputToメソッドを利用します。簡単な例ですが、月末のディスク容量を確認したい場合等にも利用することができます。-kコマンドの出力結果が保存されます。Commandにはinfoメソッドもあり、Commandの中でinfoメソッドを使用することで指定したファイルにログファイルとは別で情報を保存することができます。artisanでCommandを実行した時にコンソールにメッセージを表示させるメソッドです。comment等のメソッドがありますが、ファイルに書き込む場合に使用した場合はメソッドの違いがありません。コンソールだと文字の背景色がメソッド毎に変わったりといった違いがあります。Kernel.phpファイルでsendOutputToメソッドを追記します。->sendOutputTo(storage_path('logs/write.log'));infoメソッドを使って、ログファイルの書き込みの前後にメッセージを書き込みます。logging');}loggerのヘルパー関数のinfoはログファイルへの書き込み、$this->infoメソッドはsendOutputToメソッドで指定したファイルへの書き込みを行います。sendOutputToメソッドはファイル名を指定しただけでとファイルの上書きを行うので、ファイルに追記していきたい場合はsendOutputToの第2引数をtrueに設定するかappendOutputToメソッドを利用してください。保存したファイルをメールで送信sendOutputToで作成したファイルをメールで送信することができます。ここでのメールの中身はsendOutputToに保存した内容です。メールで送信するためにはメール設定が必要となりますが、動作確認を行うためなので.envファイルのMAIL_DRIVERをsmtpからlogに変更してメールの内容をログファイルに書き出します。Laravelでのメール設定については下記を参考にしてください。あわせて読みたいこれでLaravelメール送信が完全にわかるメールで送信するためにemailOutputToメソッドを使用します。->emailOutputTo('foo@example.com');タスクスケジュールに登録しているので時間が経過するとログファイルにメールの内容が書き出されます。メール設定を適切に行えばメール送信できることが確認できます。保存したファイルをメールで。