😊

【PHP】バッチの多重起動防止

2022/06/08に公開

排他制御の形式

ロックファイル形式

バッチ実行時にロックファイルを生成して排他制御を行う形式。

/** 
*  ロックファイルのチェックと生成
*/
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 }により、プロセス検索して排他制御を行うやり方もあるみたいですが、アドバイザリロックが一番安定してそうですね。

宣伝

パーソンリンクではエンジニアを募集しています!
https://www.wantedly.com/companies/person-link-co/projects

Discussion