草庐IT

php - flock 有可能用 LOCK_EX 返回 false 吗?

coder 2024-04-17 原文

我在 flock manual 找到了以下描述:

By default, this function will block until the requested lock is acquired

在下面我找到了以下示例代码:

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

?>

但是在任何情况下脚本实际上会返回 “Couldn't get the lock!”?我认为它会等到文件 lock.txt 解锁。如果文件永远不会解锁,那么脚本将永远等待,对吗?

此外,我发现这个答案解释了 unix 上排他锁和共享锁之间的区别:https://stackoverflow.com/a/11837714/2311074 这 4 条规则是否也适用于 PHP 中的 flock(例如“如果一个或多个共享锁已存在,则无法获取独占锁”)?

最佳答案

是的,阻止 flock可以返回false

如果提供的资源不支持锁定就会发生

示例甚至在文档中提供

May only be used on file pointers returned by fopen() for local files, or file pointers pointing to userspace streams that implement the streamWrapper::stream_lock() method.

因此,如果您尝试锁定 ftphttp 资源,您将得到 false,对于某些包装器,例如zlibphar

flock() is not supported on antiquated filesystems like FAT and its derivates and will therefore always return FALSE under these environments.

关于php - flock 有可能用 LOCK_EX 返回 false 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443326/

有关php - flock 有可能用 LOCK_EX 返回 false 吗?的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  3. ruby - 为什么 Integer.respond_to?( :even? ) 返回 false? - 2

    我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案

  4. ruby-on-rails - Rails、已安装的 Gem 版本和 Gemfile.lock 版本 - 2

    我有一个问题。如果bundle更新,Gemfile.lock总是被提交。今天,当我部署web应用程序时,我看到了这条错误消息,Couldnotfindjwt-1.5.3inanyofthesourcesjwt-1.5.2安装在已部署服务器的共享gem路径中。我认为bundleinstallnewjwt-1.5.3gem因为Gemfile.lock中指定的版本(1.5.3)和安装的版本(1.5.2)不相等。为什么不能bundleinstalljwtgem?如果找不到jwt-1.5.3,是否应该捆绑安装那个gem? 最佳答案 删除Gem

  5. Ruby Regex,获取所有可能的匹配项(不截断字符串) - 2

    我遇到了ruby​​正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:#Simpleexample"Hey".scan(/../)=>["He"]#Actualresults#Withoverlappingmatchestheresultshouldbe=>["He"],["ey"]我尝试执行并获得所有结果的正则表达式如下所示:"aaaaaa".scan(/^(..+)\1+$/)#Thislooksformultiplesof(here)"a"biggerthanonethat"fills"theentirestring."aa"*3=>true,"aaa"*2=

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. ruby-on-rails - 如何扩展 Ruby Test::Unit 断言以包含 assert_false? - 2

    显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案

  8. Ruby:用于检查 nil/false 条件语句的干净代码? - 2

    我总是遇到这个Ruby问题,我想把它写得更干净。varacanbenila.valuecanalsobenila.valuehaspossibletrueorfalsevalueif(nota.nil?)&&(nota.value.nil?)&&a.value==falseputs"avalueisnotavailable"elseputs"avalueistrue"end问题在于条件语句过于笨拙且难以阅读。如何改进检查nil和false条件语句?谢谢,我是Ruby新手 最佳答案 Rubyonrails有一个叫做try的扩展,它允许

  9. ruby-on-rails - my_object.save(false) 并没有真正跳过我的 Active Record 验证 - 2

    所以我一直在努力解决我一直遇到的这个错误,我终于找到了导致它的原因。我一直觉得,当我调用@my_model.save(false)我会跳过我的ActiveRecord验证。事实证明这是部分正确的。我的对象正在保存到数据库中DESPITE我的ActiveRecord验证。我的问题存在是因为我的一个验证在验证过程中修改了一个子模型(这是一个24小时位置的调度应用程序,因此当午餐被保存时,我对照他们保存的那天和第二天检查它们以及确保用户不是指“凌晨2点”表示要上夜类。我的问题是:有没有办法真正跳过我的验证并直接移动到数据库?这是正常的ActiveRecord行为还是我应该更深入地研究我的验证

  10. ruby - 为什么 `x =! 5` 返回 false? - 2

    我一直在研究运算符优先级,有人向我解释说x=!5返回false。我似乎无法再次向自己解释原因。我知道=!不是运算符,所以x和5仍然存在。那么这是否意味着Ruby不知道该做什么?如果是这样,ruby应该返回一个错误,因为x可能没有值?Ruby会在运算符处停止,然后将false的值赋给x吗?x=!5=>false 最佳答案 这是因为x=!5被解释为x=(!5)(!hashigerprecedencethan=)。在Ruby中,除了nil和false之外,每个对象都是true。5具有真实值,您正在使用运算符!取反。因此false作为结果被

随机推荐