#cronとは
cronはlinuxでコマンドを定期的に実行するためのデーモンプロセス。
#CakePhp3でShell
cronを使って定期処理を行う場合には、まず実行対象となるプログラムが必要になる。
CakePhp3では、コマンドから実行できるプログラムを作成する場合、Shellクラスを継承するプログラムを作る。
とりあえず、メールを送信するSendMailShell.phpを以下に示す。
なお、メール送信に関してはconfig/app.phpの編集も必要なため、そちらの詳細は
こちらの記事(CakePhp3でGmailからメールを送る)を参照していただきたい。
<?php
namespace App\Shell;
use Cake\Console\Shell;
use Cake\Mailer\Email;
class SendMailShell extends Shell
{
public function main(){
$email = new Email('default');
$email->to('送信先メールアドレス') //送信したいメールアドレスで書き直すこと
->subject('タイトル')
->send('本文');
}
}
このプログラムをsrc/Sehll以下に配置し、コマンドから実行する。
binフォルダに移動し、
cake send_mail
というように、cake shell名
で対応するShellプログラムのmain関数が実行されていく。
shell名はSendMailShell.phpだとsend_mailのようにファイル名のSehll以前をスネークケースに直したような形になる。
これにより、コマンドから起動できるCakePhp3のプログラムができたので、次にcronを使って定期的にこのプログラムを実行する。
#cronで定期実行
##crondの起動
cronを使うためにはcrondが起動していないといけない。
crondが起動しているかどうかは以下のコマンドで確認
# /etc/rc.d/init.d/crond status
crond (pid XXX)を実行中...
と表示されれば、実行されている。
実行されていない場合
# /etc/rc.d/init.d/crond start
これで実行開始。
##crontabでコマンド編集
crontab -e
のコマンドを実行すると、エディタが起動するので、これにcronコマンドを記述して保存することでそのコマンドが定期的に実行される。
###cronコマンド
cronコマンドは次のような形。
分 時 日 月 曜日 コマンド
要素 | 範囲 |
---|---|
分 | 0~59 |
時 | 0~23 |
日 | 1~31 |
月 | 1~12 |
曜日 | 0~7(0,7:日曜) |
*
(アスタリスク)を指定すると毎回実行される。
5-10
のように範囲指定もできる。
*/5
とすると5分ごとのように指定できる。
5,10,15
のように列記もできる。
時間の部分の記述の例
* * * * * 毎分実行
*/5 * * * * 5分ごとに実行
0 * * * * * 毎時0分に実行
10,30 * * * * 毎時10分と30分になったら実行
10-30 * * * * 毎時10分から30分まで毎分実行
10-30/5 * * * * 毎時10分から30分まで5分ごとに実行
コマンドは実行されるコマンドでありパスを通してないとフルパスで指定する必要があるので、/プロジェクトのbinファイルのパス/cake send_mail
となる。
最終的に毎日0時0分にメールを送信するコマンドは
0 0 * * * /プロジェクトのbinファイルのパス/cake send_mail
#多重実行防止
毎日0時0分にメール送信するだけであれば大した処理時間ではないが、毎分それなりに重い処理を行う場合は、コマンド実行中に再度コマンドが実行されるということがあり得る。
そのためには、flock
コマンドを使ってコマンドにロックをかける。
* * * * * flock -n /tmp/sendmail.lock php /プロジェクトのbinファイルのパス/cake send_mail