多くの目的で、次のコードは問題ありません(競合状態が発生する可能性がありますが、詳細なcronジョブの場合、これはおそらく非常にまれです)。
if (file_exists($lockfilename)) {
... // lock is already taken
} else {
if ( !file_put_contents($lockfilename, $lockstring)) {
error("unable to write $lockfilename");
}
$lock_taken = true;
... // do what you have to do
if ( !unlink($lockfilename)) {
warning("unable to unlink $lockfilename");
}
$lock_taken = false;
}
グローバル変数$lock_taken
は、実行が停止するたびにロックファイルが確実に削除されるようにするために役立つ場合があります。$lockstring
日付またはUnixタイムスタンプである可能性があります。これは、明らかに古すぎる場合にロックを削除するのに役立つ場合があります(ただし、十分filemtime()
な場合もあります)。
競合状態を絶対に危険にさらすことができない場合は、次のようなことを行う必要があります
if ( !($lockfile = fopen($lockfilename, "x"))) {
... // lock is already taken
} else {
$lock_taken = true;
... // write something to lockfile (optional)
fclose($lockfile);
... // do what you have to do
if ( !unlink($lockfilename)) {
warning("unable to unlink $lockfilename");
}
$lock_taken = false;
}
ただし、これはローカルロックファイルに対してのみ機能します。