您好,匿名用户
随意问技术百科期待您的加入

php阻塞式连接有没有性能的问题

+1 投票

我准备用redis的list做一个队列系统,基本思路是:

1.把信息用LPUSH操作加到redis中某个list的头部
2.写个cron定时执行php读取这个list。使用redis的RPOP操作从list尾部取走信息

此外,redis有个BRPOP的操作,当list里没有未处理信息时,会把脚本阻塞住,有新的信息时才会继续执行。

请问php怎么利用这个特性,要注意什么,另外这种长时间的连接对性能有没有什么影响?
ps.这样的队列系统设计合理吗?

用户头像 提问 2012年 12月1日 @ Anivia 上等兵 (276 威望)
分享到:

1个回答

+1 投票
 
最佳答案

首先你在shell下执行php,完全没有最长实行时间这一说,你完全可以把一个php脚本作为进程不停的监听。

但是,你用LIST做队列系统完全没必要,一个是BRPOP的block是有最长时间限制的,你不能一直hold在那里。而更好的选择是利用redis的PUB/SUB机制来做

下面是一个简单监听进程,它监听了channel-1,你在shell下执行它不要关掉

<?php
$redis->subscribe(array('channel-1'), function ($redis, $chan, $msg) {
    // do something
    echo $msg;
});

然后在其它的程序里向channel-1发送你需要发送的消息

<?php
$redis->publish('channel-1', 'hello, world!');
更新LIST方法

如果你需要用LIST来操作,完全可以不要用BRPOP,直接在循环中RPOP就行

<?php
while (true) {
    $msg = $redis->rPop('list-1');

    if (false !== $msg) {
        // 这里处理消息
    }

    // 这里可以sleep
    sleep(60);
}
用户头像 回复 2012年 12月1日 @ Kayle 上等兵 (277 威望)
选中 2012年 12月1日 @Anivia
提一个问题:

相关问题

0 投票
1 回复 131 阅读
用户头像 提问 2012年 12月1日 @ Vayne 上等兵 (271 威望)
0 投票
0 回复 43 阅读
用户头像 提问 2012年 12月1日 @ Virgo 上等兵 (284 威望)
+1 投票
1 回复 70 阅读
用户头像 提问 2012年 12月1日 @ Anivia 上等兵 (276 威望)
0 投票
1 回复 45 阅读
用户头像 提问 2012年 12月1日 @ Elise 上等兵 (273 威望)
0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Lucia 上等兵 (416 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...