flock()
是PHP的可移植咨询文件锁定函数。他们明确宣传它甚至在Windows下也可以使用:
flock()允许您执行一个简单的读写模型,可用于几乎所有平台(包括大多数Unix衍生产品甚至Windows)。
我想在阻塞的flock()
上设置一个可移植的超时(而不是使用LOCK_NB
选项的忙等待工作区)。在UNIX中,这可以通过设置会发送SIGALRM
的警报来轻松实现:
pcntl_signal(SIGALRM, function() {});
pcntl_alarm(3);
try {
if (!flock($handle, LOCK_EX)) {
throw new \Exception("Timeout");
}
} finally {
pcntl_alarm(0);
pcntl_signal_dispatch();
pcntl_signal(SIGALRM, SIG_DFL);
}
有一种便携式的方法可以对阻塞的flock()
设置超时吗?如果有,怎么做?
LOCK_NB
+ 一个循环 +usleep
? - zerkmsflock
能做的一切。PS:即使使用繁忙等待循环优雅地处理它,甚至终止进程都是奇怪的。 - zerkmsflock()
将通过返回值指示其失败。为了防止终止,可以为SIGALRM
安装一个noop信号处理程序。这不需要任何exec()
或其他进程。如果没有可移植的选项,那么我将简单地接受第一个“不,没有可移植的超时”答案。 - Markus Malkusch