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

flock()返回FALSE的原因是什么?

戴鸿羽
2023-03-14

PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。若文件被其他进程阻塞,那个么flock应该等到它被解锁(因为我们不使用LOCK_NB)。文档中没有超时,超时会中断等待,所以显然flock将无限等待,直到获得锁为止。

但是有时我在我的多线程脚本中从flock()得到FALSE。那是什么原因呢?

共有2个答案

邵骁
2023-03-14

另一个原因可能是php.ini.的“安全”限制

因此,也可以使用phpinfo()检查flock是否列在disabled_functions列表中:

郭乐湛
2023-03-14

我最近也有类似的问题,做了一个小研究。如果您查看PHP flock函数的源代码,您可以看到代码编译所依赖的操作系统的实现。

对于*nix系统有:

ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);

这意味着OS级fcntl函数被使用。

fcntl手册说明:

F_SETLKW(结构群*)

至于F_SETLK,但是如果文件上有冲突的锁,则等待该锁被释放。如果在等待时捕捉到信号,则调用会中断,并且(在信号处理程序返回后)会立即返回(返回值为-1,errno设置为EINTR;请参阅信号(7))。

 类似资料:
  • 我在flock手册中找到以下描述: 默认情况下,此功能将一直阻止,直到获得请求的锁为止 在下面,我找到了以下示例代码: 但是,是否存在脚本实际返回“无法获取锁”的情况 ?我以为它会等到文件

  • 为什么代码获取不到API返回的数据? API是免费版本, 每分钟限制45次请求,使用POST请求方式, URL中的fields=58898是返回指定字段. 我在API的网站查询IP没有问题, 但是代码中一直返回空值, requests也没有报错, 所以现在有点不知道从哪里下手了, 请大佬们帮我分析一下, 或者给点思路! 跪谢!

  • 问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么

  • 当然在文件结束或输入错误发生时返回,但这是否意味着没有更多的数据可用? 使用

  • 问题内容: 我找到了JavaDoc的方法: 返回:如果此线程已被中断,则返回true;否则返回false。 否则为假。 我对这种方法的理解有误。此外,我可能会误解Thread中的“中断”概念。 欢迎任何解释!谢谢! 程式码片段: 在线程定义中: 调用: 问题答案: 引发异常后,线程不再处于中断状态。

  • 为什么以下输出为True? 这将始终输出,即使条件似乎表明并非如此。如果我删除括号,那么它可以工作,但我不明白为什么。