3

我正在使用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';

当从不同的浏览器同时调用文件两次时,脚本可以正常工作,而如果我从同一个浏览器同时打开两个实例,它会等待,即第一个调用获取锁定,第二个调用等待锁定而不关闭

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

有什么帮助吗?

4

2 回答 2

6

问题是:

从浏览器使用相同的 url 调用相同的脚本两次将通过相同的进程和flock() 函数在进程层上非阻塞工作,导致第二个脚本等待

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

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

效果很好。

于 2012-11-11T14:30:26.477 回答
5

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

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

于 2012-11-11T14:06:19.893 回答