首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP flock()未锁定

PHP flock()未锁定
EN

Stack Overflow用户
提问于 2014-06-27 05:42:09
回答 2查看 4.5K关注 0票数 3

我很难弄清楚为什么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被设计成这样是没有意义的,所以我想看看是否有人能为我解决这个问题。

提前感谢!

代码语言:javascript
复制
<?
$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;

对以上的任何帮助都是非常感谢的!

谢谢你,丹尼尔

EN

回答 2

Stack Overflow用户

发布于 2015-06-13 23:57:12

我也遇到了同样的情况,发现问题出在浏览器上。

当向同一个URL发出多个请求时,即使是跨选项卡或窗口进行请求,浏览器也会足够“智能”地等待,直到第一个请求完成,然后浏览器尝试运行后续的请求。

因此,虽然看起来锁不工作,但实际发生的是浏览器( Chrome和Firefox)正在等待第一个请求完成,然后才运行第二个请求。

你可以通过在Chrome和Firefox中打开一次相同的URL来验证这一点。通过这样做,正如我所做的,您可能会看到锁确实按预期工作。

票数 6
EN

Stack Overflow用户

发布于 2014-06-27 05:54:42

flock有很多限制,包括多线程服务器、NFS卷等。

被接受的解决方案显然是尝试创建一个链接。

有很多关于这个话题的讨论:http://www.php.net/manual/en/function.flock.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24440731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档