Mar*_*sch 15 php timeout flock
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);
}
Run Code Online (Sandbox Code Playgroud)
是否有可移植的方法来阻止阻塞flock()
?如果是这样,怎么样?
我认为在 Windows 上没有繁忙的等待/轮询循环就没有任何方法可以做到这一点。
PHPflock
在 Windows 上使用LockFileEx
(参见 参考资料flock_compat.c:132
)来实现。正如您从这些类似的问题中看到的,无法设置超时LockFileEx
或取消等待请求的进程LockFileEx
(即没有SIGALRM
与此用例的信号等效的信号):
问)如果我想等待超时的文件锁定,我该怎么做?
...
A)编写一个小循环来检查返回码
microsoft.public.win32.programmer.kernel
邮件列表中的“LockFileEx 无法超时,它只是挂起” ,1997 年问)有谁知道让 LockFileEx 超时的方法吗?
...
A)您只能让它立即失败、休眠并循环返回,直到达到某个重试限制。