草庐IT

ruby - 如何使用 File#flock 对独占锁发出非阻塞请求?

我应该如何请求非阻塞锁?为什么Ruby没有File#flock单独尝试锁定文件时是否按预期工作?将文件锁定在一个block中并不是此问题的正确解决方案,因为重点是显示锁定持久锁的行为。在block内使用File#flock会在block退出时释放锁,因此它无法正确显示问题。File#flock以多种方式失败,尤其是在请求非阻塞锁时。下面是一些示例。File#flock的失败示例使用多个独占锁时无限等待,因为#flock不提供使锁请求超时的方法。#Firstlocksucceeds.f1=File.open('foo',File::RDWR|File::CREAT,0644)f1.flo

Windows 和 Linux 上的 PHP flock() 行为差异

我在Windows机器和Linux机器上执行相同的代码片段。两者都运行PHP5.4:$file="lock.txt";$fp=fopen($file,"w+");flock($fp,LOCK_EX);var_dump(@file_put_contents($file,'hello'.rand()));flock($fp,LOCK_UN);fclose($fp);在Windows机器上,file_put_contents()操作失败并返回false。在Linux机器上,它成功了。我试图弄清楚这两种行为中哪一种实际上是正确的,以及我如何才能标准化这两个系统的行为(为了记录,我的目标是让fi

php - php 的 file_get_contents 是否忽略文件锁定?

我已经阅读了php的manualpage关于“file_get_contents”函数,它没有说明“file_get_contents”在php文件锁定方面的行为方式。然而,在评论部分,用户Chris建议file_get_contentsdoesnotnormallyrespectPHP'sflocklocking,i.e.advisorylocking.Youcanworkaroundthiswithsomeextracodetorequestasharedlock,like...我测试成功了。我还测试了即使文件已被flock()锁定独家LOCK_EX可以让另一个php进程通过fil

php - file() 在读取时是否锁定文件?

我正在使用file()来读取一个文件,就像一个带有标签的数组。我想锁定该文件,但似乎无法让flock()处理该文件。是否有可能做到这一点?如果是这样,如何?如果不是,file()是否从一开始就锁定文件并减轻任何潜在的共享问题? 最佳答案 根据thedocumentation(特别是注释),它不会读取通过flock锁定的文件。您有2个选择。使用fgets读取文件(不检查错误):$f=fopen($file,'r');flock($f,LOCK_SH);$data=array();while($row=fgets($f)){$data[

PHP flock() 没有锁定

我无法弄清楚为什么flock()在以下情况下无法正常运行。以下代码被放入两个不同的PHP脚本中,一个是“test1.php”,另一个是“test2.php”。代码的要点是创建一个其他进程(正确使用flock()代码)应该能够写入的文件。将有许多不同的PHP脚本试图获得对该文件的独占锁,但在任何给定时间只有一个应该具有访问权限,其余所有脚本在无法获得锁时应该优雅地失败。我测试这个的方式非常简单。“test1.php”和“test2.php”都放在我服务器上的一个可通过网络访问的目录中。然后从Firefox等浏览器中执行第一个脚本,然后立即从不同的浏览器选项卡执行第二个脚本。当代码从两个不

PHP flock() 非阻塞还是阻塞为什么?

我正在使用flock()函数通过获取临时文件的锁来检查脚本的另一个实例是否已经在运行,因此下一个实例应该检查文件是否未被锁定,否则它将停止如果我从同一个浏览器同时打开两个实例,它会等待从不同的浏览器同时调用文件两次时,脚本可以正常工作,即第一次调用获取锁,第二次调用等待锁并且不关闭我知道可能有其他方法可以检查一个文件实例是否已经在工作,但大多数方法会做一些事情然后撤消它,在我的用例中,脚本可能随时结束,因为它可能需要很长时间或超过内存限制或任何原因有什么帮助吗? 最佳答案 问题是:从浏览器使用相同的url调用相同的脚本两次将通过相同

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

PHP手册说,如果锁定成功,则调用flock返回TRUE,否则返回FALSE。如果文件被其他进程阻塞,那么flock应该等到它被解除阻塞(因为我们不使用LOCK_NB)。docs中没有timeout可以打断等待,所以显然flock会无限等待直到获得lock。但有时我在多线程脚本中从flock()得到FALSE。这是什么原因? 最佳答案 我最近遇到了类似的问题并做了一个小的研究。如果您查看sourcecodeofthePHPflockfunction,您可以看到实现取决于编译代码的操作系统。对于*nix系统有:ret=fcntl(fd

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

我在flockmanual找到了以下描述:Bydefault,thisfunctionwillblockuntiltherequestedlockisacquired在下面我找到了以下示例代码:但是在任何情况下脚本实际上会返回“Couldn'tgetthelock!”?我认为它会等到文件lock.txt解锁。如果文件永远不会解锁,那么脚本将永远等待,对吗?此外,我发现这个答案解释了unix上排他锁和共享锁之间的区别:https://stackoverflow.com/a/11837714/2311074这4条规则是否也适用于PHP中的flock(例如“如果一个或多个共享锁已存在,则无法

php - fopen(file,w+) 在我检查文件是否被 flock() 锁定之前截断文件

我有一个接收文件名和json对象以写入文本文件的函数。对象已更新,需要完全替换文件的当前内容。每个站点访问者都有自己的文件。多次快速更改会导致文件被fopen(file,w+)截断,然后由于锁定而无法写入。最终结果是空文件。我确信有一种标准的简单方法可以做到这一点,因为这是一项非常常见的事件。理想情况下,我正在寻找一种在w+模式下使用fopen截断文件之前检查文件是否有锁的方法,或者一种切换模式的方法。这似乎很奇怪,您必须使用fopen()截断文件以获取文件句柄以传递给flock()以检查它是否已锁定--但你只是截断了它,那有什么意义呢?这是我目前拥有的功能:functionupdat

php - 防止flock引起的死锁

我正在尝试模拟在繁忙站点上写入文件。我编写了以下代码,最终导致计算机卡住。$loop=10000;$sleep=500000;$i=0;while($i我不能使用LOCK_NB,因为它不能在Windows上运行。如果少于13个进程同时执行上述代码,则代码工作正常。我该如何应对这种僵局情况? 最佳答案 阅读您的代码,我认为您应该将flock($handler,LOCK_UN);移动到if(flock($handler,LOCK_EX)){}中条件block。为了准确找出卡住的内容和位置,我会在每次调用flock()之前和之后添加时间戳