😊
【PHP】バッチの多重起動防止
排他制御の形式
ロックファイル形式
バッチ実行時にロックファイルを生成して排他制御を行う形式。
/**
* ロックファイルのチェックと生成
*/
private function startProcess()
{
$lock_file = self::FILE_PATH . self::LOCK_FILE_NAME;
if (file_exists($lock_file)) {
/** プロセスが起動中です */
exit();
}
touch( $lock_file );
}
/**
* ロックファイルの削除
*/
private function finishProcess()
{
unlink(self::FILE_PATH . self::LOCK_FILE_NAME);
}
でも、これだとプログラムが強制終了した場合は、ロックファイルが残って、やっかいですな。
アドバイザリロック
ファイル自身にロックをかけて排他制御を行う形式。
private function advisoryLock()
{
static $file;
try {
$file = new \SplFileObject(__FILE __);
if ($file->flock(LOCK_EX | LOCK_NB) === false ) {
throw new \Exception('排他の確保に失敗しました');
}
} catch (\Exception $e) {
echo $e->getMessage()
}
}
flock()でファイルに排他的ロック&ロック中にflock()防止を入れておけば、
気持ちがいいです。cronでやる場合は、再実行の処理を忘れずに。
まとめ
ps aux | grep -i ${ 実行COMMAND }
により、プロセス検索して排他制御を行うやり方もあるみたいですが、アドバイザリロックが一番安定してそうですね。
宣伝
パーソンリンクではエンジニアを募集しています!
Discussion