Maison  >  Article  >  développement back-end  >  redis-pub-发布--sub-订阅 - php关于redis订阅的疑问

redis-pub-发布--sub-订阅 - php关于redis订阅的疑问

WBOY
WBOYoriginal
2016-06-06 20:13:11923parcourir

一.最近在研究redis的pub/sub(发布订阅功能),使用phpredis提供的接口来操作数据。
目前疑问:
1.怎么设置,能够解决redis subscribe的timeout限制?
redis.conf配置里的 timeout为0
我的redis版本:

<code>Redis server v=3.0.4 sha=00000000:0 malloc=libc bits=64 build=ee774adfcab9032f
</code>

我的php版本:

<code>PHP 5.5.30 (cli) (built: Oct  3 2015 23:46:56) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
</code>

1.1在网上找到的答案,有说设置php.ini的:

<code> default_socket_time = -1
 </code>

但是我这测试不成功,直接就报:

<code>redis server went away
</code>

1.2目前是参考的这个链接,加上了这个配置:

<code>$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
</code>

本地测试是一直在连接状态。
2.订阅端怎么保证一直运行(keep running),来做到实时订阅到消息?

是不是只要redis的sub没有超时,这个php脚本就会一直运行下去呢?

3.有的文章里说redis的subscribe是阻塞模式,有的说不是,到底是不是呢,阻塞模式是个什么概念?

我目前的脚本如下,本地测试是在一直运行的,但是不知道到线上后会不会有什么问题。

二.订阅功能的脚本为subscribe.php

<code>//subscribe.php
 
function f($redis, $chan, $msg) {
    switch($chan) {
        case 'chan-1':
            print "get $msg from $chan\n";
            break;
        case 'chan-2':
            print "get $msg FROM $chan\n";
            break;
        case 'chan-3':
            break;
    }
}
 
ini_set('default_socket_timeout', -1);
 
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f');
print "\n";
</code>

三.执行脚本:

<code>php subscribe.php

求高人指点!
</code>

回复内容:

一.最近在研究redis的pub/sub(发布订阅功能),使用phpredis提供的接口来操作数据。
目前疑问:
1.怎么设置,能够解决redis subscribe的timeout限制?
redis.conf配置里的 timeout为0
我的redis版本:

<code>Redis server v=3.0.4 sha=00000000:0 malloc=libc bits=64 build=ee774adfcab9032f
</code>

我的php版本:

<code>PHP 5.5.30 (cli) (built: Oct  3 2015 23:46:56) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
</code>

1.1在网上找到的答案,有说设置php.ini的:

<code> default_socket_time = -1
 </code>

但是我这测试不成功,直接就报:

<code>redis server went away
</code>

1.2目前是参考的这个链接,加上了这个配置:

<code>$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
</code>

本地测试是一直在连接状态。
2.订阅端怎么保证一直运行(keep running),来做到实时订阅到消息?

是不是只要redis的sub没有超时,这个php脚本就会一直运行下去呢?

3.有的文章里说redis的subscribe是阻塞模式,有的说不是,到底是不是呢,阻塞模式是个什么概念?

我目前的脚本如下,本地测试是在一直运行的,但是不知道到线上后会不会有什么问题。

二.订阅功能的脚本为subscribe.php

<code>//subscribe.php
 
function f($redis, $chan, $msg) {
    switch($chan) {
        case 'chan-1':
            print "get $msg from $chan\n";
            break;
        case 'chan-2':
            print "get $msg FROM $chan\n";
            break;
        case 'chan-3':
            break;
    }
}
 
ini_set('default_socket_timeout', -1);
 
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
$redis->subscribe(array('chan-1', 'chan-2', 'chan-3'), 'f');
print "\n";
</code>

三.执行脚本:

<code>php subscribe.php

求高人指点!
</code>
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn