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()
上设置超时?如果是这样,怎么样?
答案 0 :(得分:1)
我认为在没有繁忙的等待/轮询循环的情况下,没有办法在Windows上执行此操作。
PHP使用flock
在Windows上实现LockFileEx
(请参阅flock_compat.c:132
)。从这些类似问题中可以看出,无法在LockFileEx
上设置超时或取消等待LockFileEx
请求的进程(即没有与SIGALRM
等效的进程这个用例的信号):
问)如果我想等待超时的文件锁定,我该怎么办呢?
...
A)写一个小循环来检查返回码
microsoft.public.win32.programmer.kernel
邮件列表,1997 问)有没有人知道让LockFileEx超时的方法?
...
A)你只能让它失败,睡眠和循环 直到达到某个重试限制。