PHPの多重起動防止の書き方

実行時にロックファイルを作成して、実行が終わったら削除する

<?php

$lock_file = "./test.lock";

if (!file_exists($lock_file)){
	$fp = fopen($lock_file, "w+");

	for($i = 0; $i < 50; $i++){
		sleep(1);
	}

	fclose($fp);
	unlink($lock_file);
} else {
	echo "Already running!!";
}

ただし、実行中にエラーがあることがあるので、排他ロックをするという方法もある。

$file = fopen("test.lock", "w+");

if (flock($file, LOCK_EX + LOCK_NB)){
	
	for($i = 0; $i < 50; $i++){
		sleep(1);
	}

	flock($file, LOCK_UN);
} else {
	echo "Already running!!";
}

LOCK_EX: 排他的なロック。このフラグ単体だけの場合、他プロセスがアクセスした時に解除されるまでブロックするという挙動になる