WindowsでLaravelのスケジュールタスク設定(前編)
以前はLinuxとかでcron jobの設定をやっていましたが、今回初めてwindows環境で設定することが求められました。Linuxサーバーが多いため、公式のドキュメントではwindowsについて全く触れていませんでした。
タスクスケジューラーの設定
調べてみれば、windowsでは、タスクスケジューラーでこちらの設定が可能です。
ここは一旦先にLaravelのコードを用意します。Laravelのタスクスケジューリングについて[公式](タスクスケジュール 6.x Laravel)でいろんな例が挙げられていますので、ここは最も簡単なクロージャのやり方を例にします(7,8も同じく)。
namespace App\Console;
//...
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
\App\Models\MUser::find(1)->notify(new SyncNotification());
})->everyMinute();
}
これでid=1のユーザに1分毎にSyncNotification
の通知を送ることができます。コマンドラインでphp artisan schedule:run
を打てば上記のタスクが実行されます。ただ一回だけで終わり、周期的には実行されませんので、要はwindows側のphp artisan schedule:run
を周期的に実行するように、設定が必要です。
まずはwindowsのタスクスケジューラーを開きます。PCのアイコンで右クリックから「管理」を選ぶといけますが、直接スタートメニューでタスクスケジューラーを検索するのも入れます。
次に右側にタスクの作成をクリックしてタスクを追加します。
ここで2つのやり方があります。1)一つはバッチファイルを作って、実行するコマンドを書くこと、2)もう一つは実行時引数として設定することです。先に実行時引数の設定のやり方をみましょう。
操作のタブで新規をクリックして新しい操作を作ります。ここの実行プログラムはphpのインストール先のパスとなります。引数はlaravelのタスクランコマンドとなります。
C:\Users\username\projects\project_folder\artisan schedule:run
次にトリガーの設定を行います。トリガーで新規を作ると、次のように設定します。ちなみに、間隔は365日でも、1日でも機能します。繰り返し間隔は手動で1分間に変更可能です。継続時間は無期限に。
ここで要注意するのは、開始時間の設定です。デフォルトとして現在時刻になっていますが、設定が終わるタイミングだとすでに過ぎています。何が問題かというと、これで設定完了して実行したとしても、一回しか実行されません(周期的に設定したにも関わらず)。ここで少し躓いたが、どうやらこの仕組みというのは、トリガーされた後、から周期的に実行する、とのことです。つまり、手動でこのタスクを実行したとしても、トリガーにはなりません!!
そのため、もし開始時間を少し先に変更しないと、明日のこの時間にならないと周期タスクは開始されません。今すぐに試したい場合は、開始時刻を数分先に設定しておくのがおすすめです。
後は設定のタブで「タスクを要求時に実行する」をチェックに入れると、手動でタスクを実行できるようになります。ただこれは一回しか実行されませんので、上記のような周期的タスクのトリガーにはなりません。
これでタスクを登録すれば一応windows側の設定は完了となりますので、トリガーの時間となれば、1分毎にphp artisan schedule:run
を実行してくれます。その際にLaravelで定義されているタスクが実行されます。
最後に、バッチファイルのやり方もメモしておきます。実は結構似ていますが、まずこういうバッチファイルを作ります。
# periodic.bat
cd C:\Users\username\projects\project_folder\
php artisan schedule:run 1>> NUL 2>&1
中身も特に説明するところがなく、単純にプロジェクトのフォルダに行ってphp artisan schedule:run
を実行するものです。最後尾のstdin/stdout/stderrのリダイレクトについてはこちらの記事に詳しく説明されています。
バッチファイルを実行する場合、操作のところでプログラムのパスを変更し、引数はなしで大丈夫です。他の設定は全部同じです。
前編では設定だけをまとめましたが、後編でスケジュールのジョブの使い方について紹介します。
Discussion