Home > Backend Development > PHP Tutorial > redis-pub-发布--sub-订阅 - php关于redis订阅的疑问

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

WBOY
Release: 2016-06-06 20:13:11
Original
961 people have browsed it

一.最近在研究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>
Copy after login
Copy after login

我的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>
Copy after login
Copy after login

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

<code> default_socket_time = -1
 </code>
Copy after login
Copy after login

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

<code>redis server went away
</code>
Copy after login
Copy after login

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

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

本地测试是一直在连接状态。
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>
Copy after login
Copy after login

三.执行脚本:

<code>php subscribe.php

求高人指点!
</code>
Copy after login
Copy after login

回复内容:

一.最近在研究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>
Copy after login
Copy after login

我的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>
Copy after login
Copy after login

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

<code> default_socket_time = -1
 </code>
Copy after login
Copy after login

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

<code>redis server went away
</code>
Copy after login
Copy after login

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

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

本地测试是一直在连接状态。
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>
Copy after login
Copy after login

三.执行脚本:

<code>php subscribe.php

求高人指点!
</code>
Copy after login
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template