PHP flock()非阻塞仍然阻止了为什么?

时间:2012-11-11 14:03:04

标签: php flock

我正在使用flock()函数通过获取临时文件上的锁来检查脚本的另一个实例是否已在运行,因此下一个实例应该检查文件是否未锁定,否则它将停止

<?php    
$fp = fopen("/var/tmp/your.lock", "w");
if (!flock($fp, LOCK_EX|LOCK_NB)) { // try to get exclusive lock, non-blocking
    die("Another instance is running");
} 

//my script 
sleep(10);
echo 'completed successfully';
如果我从同一个浏览器同时打开两个实例,即第一个调用获取锁定,第二个调用等待锁定,则从不同浏览器同时调用文件两次时,脚本可以正常工作而不是关闭

我知道可能还有其他方法可以检查一个实例文件是否已经正常工作但是大部分都会做一件事然后撤消它,在我的用例中,脚本可能随时结束,因为它可能需要很长时间或超过内存限制或任何原因

任何帮助?

2 个答案:

答案 0 :(得分:6)

问题是:

使用来自浏览器的相同URL调用相同的脚本两次将通过相同的进程进行线程并且flock()函数在进程层上进行非阻塞工作,导致第二个脚本等待

作为示例呼叫     example.com/test.php 两次将导致两个请求在同一进程上工作wile附加任何随机变量将为每个单独的请求创建单独的进程,如

example.com/test.php?rand=1
example.com/test.php?rand=2

效果很好。

答案 1 :(得分:3)

从命令行运行相同的脚本两次。我愿意打赌它运作得很好。

有可能您的浏览器通过仅允许一次连接到任何给定主机来限制与服务器的连接。您在不同浏览器中获得不同结果的事实表明它不是PHP问题,因为无论请求页面的浏览器如何,PHP都将执行相同的操作。