redis的订阅subscribe用法,可用于消息推送、统计、异步处理问题、短信发送等操作,速度非常快

redis的订阅功能就像微信公众号,你关注了就可以接收对应公众号的推送消息,你可以同时关注多个公众号,同样道理你可以关注多个订阅渠道channel,比如做一个redis订阅服务,在后台运行,推送过来的按渠道区分操作相关逻辑,比如邮件发送、异步处理问题、批量发送消息等。


新建一个sub.php作为订阅服务(修改后记得重启这个文件才生效):

<?php
set_time_limit(0);
$redis = new Redis();
if (!$redis->connect('127.0.0.1', 6379)) {
    exit('redis连接失败');
}

//监听了两个渠道test_queue和test_error,回调
$redis->subscribe(['test_queue', 'test_error'], 'callback');

//the redis instance, the channel name, and the message
function callback($redis, $channel_name, $message)
{
    //可以取消订阅某个渠道
    #$redis->unsubscribe(['test_error']);
    //测试是否启动了订阅服务
    if ($message=='ping') return;
    //在终端输出
    echo 'channel_name:' . $channel_name . ';message:' . PHP_EOL . $message . PHP_EOL;
    //记录日志
    file_put_contents('subscribe_'.$channel_name . ".log", $message . PHP_EOL . '==============================' . PHP_EOL, FILE_APPEND);
}

然后命令启动(实际上这个文件最好设置后台运行并且监听异常):

php sub.php


新建一个发布消息的客户端push.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'on');
//发送消息客户端
$redis = new Redis();
if (!$redis->connect('127.0.0.1', 6379)) {
    exit('redis连接失败');
}
//测试一下是否有订阅
if (!$redis->publish('test_queue', 'ping')) {
    exit('订阅服务未启动');
}

for ($i = 0; $i <= 6; $i++) {
    //模拟一个消息
    $message = ['msg' => 'success', 'code' => 0, 'data' => ['num' => $i, 'type' => 'normal', 'time' => date('Y-m-d H:i:s')]];

    if ($i % 3 == 0) {
        //随便写点不一样的
        $message['data']['type'] = 'error';
        //新的渠道
        $redis->publish('test_error', json_encode($message));
    } else {
        $redis->publish('test_queue', json_encode($message));
    }
    //延迟0.5秒
    usleep(500000);
}

在浏览器访问push.php或者命令行php push.php


sub.php终端输出:

image.png

同时生成了日志文件

image.png

日志内容如下:

{"msg":"success","code":0,"data":{"num":1,"type":"normal","time":"2022-11-08 10:00:18"}}
==============================
{"msg":"success","code":0,"data":{"num":2,"type":"normal","time":"2022-11-08 10:00:18"}}
==============================
{"msg":"success","code":0,"data":{"num":4,"type":"normal","time":"2022-11-08 10:00:19"}}
==============================
{"msg":"success","code":0,"data":{"num":5,"type":"normal","time":"2022-11-08 10:00:20"}}

===========error文件==============
{"msg":"success","code":0,"data":{"num":0,"type":"error","time":"2022-11-08 10:00:17"}}
==============================
{"msg":"success","code":0,"data":{"num":3,"type":"error","time":"2022-11-08 10:00:19"}}
==============================
{"msg":"success","code":0,"data":{"num":6,"type":"error","time":"2022-11-08 10:00:21"}}
==============================


按这种方式可以做很多东西功能了。

评论/留言