【问题标题】:Is there a portable way to put a timeout on flock()?有没有一种可移植的方法来设置flock() 的超时时间?
【发布时间】: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:奇怪的是,甚至想要终止进程而不是优雅地处理它(即使是繁忙的等待循环)

标签: php timeout flock


【解决方案1】:

我认为没有任何方法可以在没有繁忙的等待/轮询循环的情况下在 Windows 上执行此操作。

PHP 在 Windows 上使用LockFileEx 实现flock(请参阅flock_compat.c:132)。正如您从这些类似的问题中看到的那样,无法在LockFileEx 上设置超时或取消等待LockFileEx 请求的进程(即,对于此用例,没有等效于SIGALRM 信号):

  1. LockFile with timeout?(2011 年问)

Q) 如果我想等待超时的文件锁定,我该怎么做?

...

A) 编写一个小循环来检查返回码

  1. "LockFileEx can't time out it just hangs" 来自 microsoft.public.win32.programmer.kernel 邮件列表,1997 年

Q) 有谁知道让 LockFileEx 超时的方法吗?

...

A) 你只能让它立即失败、休眠并循环返回 直到达到某个重试限制。

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多