日常的にcronを使って、時限式でPHPで書いたスクリプトを実行しているのですが、例えば負荷などの影響で実行に遅延が発生した場合、cronで同じプログラムが実行されることがあります。そんな時、現在実行中の場合には実行させないようにする方法を使っているので、念のためにメモがてら記載しておきます。

多重起動防止のため、実行中には空のファイルを作成しておく

多重起動防止の理屈はかなりシンプルなのですが、起動の際に空のファイルを作成しておいて、そのファイルがある場合には実行させないという仕組みを埋め込むものです。

以下のスクリプトで実現が可能にになります。

$lock_filename='フルパスで入れておく/hoge.txt';
if( file_exists($lock_filename) ){
//ここにメッセージをechoで入れるのもよい
exit(0);////ファイルが存在する場合、プログラムを停止させる
}

// 実行する前にファイルを作成する
touch( $lock_file );

///処理を記載

///処理が終わったら、空のファイルを削除する
unlink( $lock_filename );

流れとしては、まず空のファイルがあるかどうかをチェックします。

ある場合には強制終了、ない場合には処理をすすめ、処理を行う際には空のファイルを作成、処理が終われば空のファイルを削除するという、かなりシンプルな構成です。

このように組み込むことで、多重起動を防止することが可能です。

異常終了した場合の注意点

問題点としては、異常終了した場合、空のファイルは残ったままになるというのが欠点になります。

そんな場合には、cron で定期的に空のファイルをチェックしにいって、一定時間で削除するスクリプトを組むといいかもしれません。

そんな感じで以上です。

コメント