Heim  >  Artikel  >  Backend-Entwicklung  >  并发 - php flock用法

并发 - php flock用法

WBOY
WBOYOriginal
2016-06-06 20:07:59896Durchsuche

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

<code><?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);
</code></code>

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

回复内容:

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

<code><?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);
</code></code>

当我在浏览器中两个窗口同时访问这个文件,预期结果是第一个窗口会在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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn