php使用redis的blPop/brPop,一台服务器同时只能执行一次?
phpcn_u1582
phpcn_u1582 2017-05-16 12:59:45
0
2
682

服务器是使用 nginx + php-fpm 的架构,redis用的是connect来连接,每个网络请求应该都会有单独的php-fpm进程。我写了一个 循环,循环中有blPop/brPopsleep(5) 。浏览器先后开了两个标签页跑,然后 lpush 了4个数据进 list 发现总是先跑的那个标签页能读到前两个数据。也就是说blPop/brPop堵塞了整个服务器的所有其它侦听同一key的blPop/brPop
以下是我测试的代码:

//堵塞出队列
public function test(){
    tool::load('hRedis.php');
    $timeOut = 20;//堵塞20秒

    $cn = 'test_blist';

    $ress = [];
    for($i=0;$i<2;$i++){
        $ress[] = hRedis::cacheListBPop($cn,$timeOut);//这里面封装了redis的blPop/brPop
        sleep(5);
    }

    print_r($ress);
}

为什么在 先跑的进程的sleep 期间,后跑的进程还会被堵塞?

又做了进一步的测试,把循环去掉了,每个进程只执行一次,并且每次读取完 使用 redis->close() 发现两个进程的结束时间,还是相差了16秒左右。

上一条测试,我又放到两台服务器上去测,这次不是同一台的两个进程了,而是两台服务器,发现两台服务器的结束时间,相差的秒数就是我插入两条数据相隔的时间!这次没有延迟了!

phpcn_u1582
phpcn_u1582

全員に返信(2)
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!