当前位置: 首页 > 知识库问答 >
问题:

是否有一种可移植的方法在flock()上设置超时?

华心思
2023-03-14

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()上设置超时?如果有,如何?

共有1个答案

百里俭
2023-03-14

我不认为在没有繁忙的等待/轮询循环的情况下,在视窗上有任何方法可以做到这一点。

PHP使用LockFileEx在窗口上实现flock(参见flock_compat. c: 132)。从这些类似的问题中可以看出,没有办法在LockFileEx上设置超时,也没有办法取消等待LockFileEx请求的进程(即没有等同于SIGALRM的信号这个用例):

  1. 锁定文件超时?(2011年提问)

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

...

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

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

...

A) 您只能让它立即失败、Hibernate并循环,直到达到某个重试限制。

 类似资料:
  • 这似乎表明含意没有被设定。我做错什么了吗?有办法把这个放在别处吗?

  • 问题内容: 我想从数据库中读取数据,例如说1万条记录。 我在Wikipedia上找到了“结果限制”,而且很明显,这不能以可移植的方式使用sql来完成。 另一种方法是JdbcTemplate,它提供了许多查询方法,但是我如何确定已读取足够的行。通过诸如RowMapper和ResultSetExtractor之类的回调,无法表明已经读取了足够的数据。 问题答案: 抓住Hibernate或JPA。两者都

  • 问题内容: 有没有办法在给定类的所有方法上设置断点? 我有一个庞大的(2300行)旧式类,我需要在所有方法调用上设置断点以了解这种混乱的工作方式。 问题答案: 我发现了解决方法: 1.我将“ Toggle Brakepoint”热键设置为+ 。 2.之后,您可以单击第一种方法 。3.使用“切换制动点” 4. + -转到“下一方法”。(+ -转到上一个方法。) 5.重复3步。

  • 问题内容: 有没有一种可移植的方式来获取Python中当前用户的用户名(即,至少在和下都可以使用)。它会像这样工作: 我四处搜寻,很惊讶地没有找到一个明确的答案(尽管也许我只是在谷歌搜索方面很差)。该PWD模块提供了一个相对简单的方法来实现这一目标下,说,Linux的,但它不存在于Windows。一些搜索结果表明,在某些情况下(例如,作为Windows服务运行),在Windows下获取用户名可能很

  • 理想情况下,如果可以在执行查询之后(但在返回行之前)自动设置,那就太好了。 有没有更好的方法? 我正在使用org。springframework。jdbc。果心支持JDBCDAO支持。SimpleJdbcDaoSupport getJdbcTemplate()。setFetchSize(1000);

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。