php flock用法

发布于 2022-09-02 16:08:36 字数 781 浏览 25 评论 0

因为一个php文件要定时处理文件,时间间隔为几秒,我怕处理时间太长的话,就会放生并发问题,所以使用了flock对文件加锁,并且是非阻塞的,这样后一个请求在前一个没处理完之前会直接退出,但使用了flock函数的效果跟我预期的不一样.
index.php 文件如下:

<?php

    $file='x.lock';
    $fp=fopen($file, 'w+');

    if(!$fp){
        die('io err');
    }

    if(!flock($fp, LOCK_EX | LOCK_NB)){
        echo 'get lock fail';
        return;
    }else{
        echo 'get lock success';
        sleep(5);
        flock($fp, LOCK_UN);
    }
    fclose($fp);

当我在浏览器中两个窗口同时访问这个文件,预期结果是第一个窗口会在5秒后显示"get lock success",第二个窗口会立即显示"get lock fail",因为是我设置了LOCK_NB非阻塞.但结果确不是这样,后访问的窗口的请求还是会被阻塞,在5秒后才会响应获得锁成功,但当我给第二个窗口的url后加上一个参数比如index.php?r=xxxx,第一个url还是index.php,这个时候第二个窗口的请求是非阻塞的.之后我又用两个不同的浏览器,一个火狐一个chrome浏览器同时访问,结果也是非阻塞的.所以对flock的正确用法产生了疑惑,希望能有人帮我解释一下这个flock的正确用法,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

家住魔仙堡 2022-09-09 16:08:36

浏览器的原因 看看这个 https://lordong.net/wp/post/1337.html

攒眉千度 2022-09-09 16:08:36

建议使用数据库来管理锁。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文