出于许多目的,以下代码是可以的(可能存在竞争条件,但对于分钟的 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
可能有助于确保在执行停止时删除锁定文件。可以是日期或 Unix 时间戳,如果它明显太旧(但可能就足够了),$lockstring
它可能对移除锁很有用。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;
}
不过,这只适用于本地锁文件。