我很难弄清楚为什么flock()在下面的场景中不能正常运行。
下面的代码放在两个不同的PHP脚本中,一个是"test1.php“,另一个是"test2.php”。代码的要点是创建一个其他进程(正确使用flock()代码)都不能写入的文件。将有许多不同的PHP脚本试图获得此文件的独占锁,但在任何给定的时间,只有一个脚本应该具有访问权限,当它们无法获得锁时,所有其他脚本应该都会优雅地失败。
我测试的方法非常简单。"test1.php“和"test2.php”都放在我的服务器上一个可通过web访问的目录中。然后从Firefox等浏览器执行第一个脚本,紧接着从不同的浏览器选项卡执行第二个脚本。当代码从两个不同的PHP脚本(如"test1.php“和"test2.php”)运行时,这似乎是有效的,但当代码从相同的"test1.php“脚本或"test2.php”脚本运行两次时,第二个运行的脚本不会立即返回失败。
我能想到的唯一原因是,flock()将具有相同文件名的所有PHP进程视为相同的进程。如果是这种情况,那么当"test1.php“或"test2.php”运行两次(从两个不同的浏览器选项卡)时,PHP会将它们视为相同的进程,因此不会导致锁定失败。但对我来说,PHP被设计成这样是没有意义的,所以我想看看是否有人能为我解决这个问题。
提前感谢!
<?
$file = 'command.bat';
echo "Starting script...";
flush();
$handle = fopen($file, 'w+');
echo "Lets try locking...";
flush();
if(is_resource($handle)){
echo "good resource...";
flush();
if(flock($handle, LOCK_EX | LOCK_NB) === TRUE){
echo "Got lock!";
flush();
sleep(100);
flock($fp, LOCK_UN);
}else{
echo "Failed to get lock!";
flush();
}
}else{
echo "bad resource...";
flush();
}
exit;对以上的任何帮助都是非常感谢的!
谢谢你,丹尼尔
发布于 2015-06-13 23:57:12
我也遇到了同样的情况,发现问题出在浏览器上。
当向同一个URL发出多个请求时,即使是跨选项卡或窗口进行请求,浏览器也会足够“智能”地等待,直到第一个请求完成,然后浏览器尝试运行后续的请求。
因此,虽然看起来锁不工作,但实际发生的是浏览器( Chrome和Firefox)正在等待第一个请求完成,然后才运行第二个请求。
你可以通过在Chrome和Firefox中打开一次相同的URL来验证这一点。通过这样做,正如我所做的,您可能会看到锁确实按预期工作。
发布于 2014-06-27 05:54:42
flock有很多限制,包括多线程服务器、NFS卷等。
被接受的解决方案显然是尝试创建一个链接。
有很多关于这个话题的讨论:http://www.php.net/manual/en/function.flock.php
https://stackoverflow.com/questions/24440731
复制相似问题