gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:09:57 25 4
gpt4 key购买 nike

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

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

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

有什么帮助吗?

最佳答案

问题是:

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

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

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

效果很好。

关于PHP flock() 非阻塞还是阻塞为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com