Posted at

cronを使ってCakePhp3で定期処理

More than 3 years have passed since last update.


cronとは

cronはlinuxでコマンドを定期的に実行するためのデーモンプロセス。


CakePhp3でShell

cronを使って定期処理を行う場合には、まず実行対象となるプログラムが必要になる。

CakePhp3では、コマンドから実行できるプログラムを作成する場合、Shellクラスを継承するプログラムを作る。

とりあえず、メールを送信するSendMailShell.phpを以下に示す。

なお、メール送信に関してはconfig/app.phpの編集も必要なため、そちらの詳細は

こちらの記事(CakePhp3でGmailからメールを送る)を参照していただきたい。


SendMailShell.php

<?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