并发 - php flock用法

查看:177
本文介绍了并发 - php flock用法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

因为一个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的正确用法,谢谢

解决方案

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

这篇关于并发 - php flock用法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆