【发布时间】:2017-04-04 06:43:28
【问题描述】:
flock() 是 PHP 的 portable 咨询文件锁定功能。他们明确宣传它甚至可以在 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? -
> 并且使用 LOCK_NB 选项无需忙于等待工作
-
@zerkms 我确定他已经看过了……实际的答案是在 PHP 中没有办法做到这一点。 Windows 有报警功能,但它没有通过 PHP 中的任何扩展公开。
-
@bwoebi 好吧,他们决定玩迂腐。我也是 -
flock可以做的所有事情都在该页面(或 php 源代码)中进行了解释。 PS:奇怪的是,甚至想要终止进程而不是优雅地处理它(即使是繁忙的等待循环)