订阅发布其实也是属于一种特殊的消息队列Queue机制,与redis的普通队列list区别在于,如果订阅端存在多个消费端的情况下。每个消费订阅端都会执行 发布端的消息业务。
订阅端代码:
function connectCliRedis():Redis{
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT,-1); // 使其守护进程不会出现超时错误
return $redis;
}
// 连接Redis
$redis = connectCliRedis();
while(true){
if($redis->ping() != "+PONG"){
$redis = connectCliRedis();
}
$redis->subscribe(['sunsun',"miling"],function(Redis $redis,string $channel,string $message){
var_dump( $channel, $message);
sleep(10);
});
echo "循环跳出 \n";
}
发布端代码:
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT,-1); // 使其守护进程不会出现超时错误
$r1 = $redis->publish("sunsun","这是消息管道 sunsun 的消息");
// 1.当消费管道 sunsun 未启动的时候, 发布的返回值等于0. 返回值是一个int 等于订阅该频道的数量
// 2.发布/订阅模型的消息是不能保留的。
var_dump($r1);