多種用途,下面的代碼就可以了(有可能是一個競爭條件,但對於細微的cronjob這可能是非常罕見):
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;
}
這僅適用於本地的lockfiles作品,雖然。