我正在尝试找到一种安全的方法来防止 cron 作业冲突(即,如果另一个实例已经在运行,则阻止它运行)。
一些 options I've found recommend在文件上使用锁。
这真的是一个安全的选择吗?例如,如果脚本死了会发生什么?锁会保留吗?
还有其他方法吗?
最佳答案
此样本取自 http://php.net/flock并稍作改动,这是一种正确的方式来做你想做的事:
$fp = fopen("/path/to/lock/file", "w+");
if (flock($fp, LOCK_EX | LOCK_NB)) { // do an exclusive lock
// do the work
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
不要使用诸如 /tmp
或 /var/tmp
之类的位置,因为它们可能随时被您的系统清理,因此根据文档弄乱了你的锁:
Programs must not assume that any files or directories in /tmp are preserved between invocations of the program.
https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.html
请使用您控制的位置。
学分:
- Michaël Perrin - 建议使用
w+
而不是r+
关于PHP - 防止 Cron 中的冲突 - 文件锁定安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5428631/