• php-redis 消息订阅笔记


    最近学习了一下php-redis相关的知识,其中有一个功能叫发布订阅,Redis 发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。

    直接上php代码如下:

    普通 - 【发送者pub】- pub.php

    1 $redis = new Redis();
    2 $redis->connect('127.0.0.1', 6379);
    3 $redis->auth('requirepass');
    4 
    5 $res = $redis->publish('channel', date('Y-m-d H:i:s'));
    6 var_dump($res); //成功返回1,失败返回0

    普通 - 【订阅者sub】- sub.php

    1 $redis = new Redis();
    2 $redis->connect('127.0.0.1', 6379);
    3 $redis->auth('requirepass');
    4 $redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
    5 
    6 function callback ($redisObj, $channel, $msg){
    7     echo 'ChannelName is '.$channel.', Msg is '.$msg; //ChannelName is channel, Msg is 2019-07-17 09:53:55
    8 }
    9 $redis->subscribe(['channel'], 'callback');

    这种发送和订阅的原理可以理解成一端发送,另外一端马上收到消息,确切的说就是通过向channel频道发送消息,其他订阅了channel频道的端都可以立马收到消息。

     【设置有效期的键值】 - pub.php

    1 $job = 'notify#' . date('YmdHis');
    2 $res = $redis->setex($job, 10, 'waiting');
    3 var_dump($res); //成功返回bool(true),失败返回bool(false)

    【键空间消息订阅】- sub.php

    1 $redisKey = '__keyevent@0__:expired'; //这个格式是固定的,0表示第一个库,redis默认使用第一个库0
    2 $redis->psubscribe([$redisKey], 'callBack');
    3 function callBack($redisObj, $pattern, $channel, $msg) {
    4     echo $msg."
    "; //notify#20190717100350
    5 }

    这种发送和订阅的原理可以理解成当键值过期的时候会自动发送消息,另外一端开启了键空间消息的订阅就可以收到消息了。

    特别说明:因为订阅事件启动后是阻塞执行的,所以需要一直挂着终端等待订阅,这种情况只能满足测试开发,如果是实际应用就不行了,这个时候我们希望监听后台始终运行希望像守护进程一样在后台,Linux系统中,可以使用nohup命令,具体用法待续。

  • 相关阅读:
    EMIF接口的寻址问题
    C6000系类的内联函数
    C6000代码层面优化(一)
    RHCE学习笔记
    找出并关闭Ruby On Rails进程.
    Rails4添加bootstrap支持
    如何删除gnome3面板上的图标?
    出现 ruby cannot load such file -- zlib 问题的解决方法
    Debian安装软件时提示插入光盘
    Debian7桌面屏蔽图标和右键菜单的解决方法。
  • 原文地址:https://www.cnblogs.com/firstlady/p/11199091.html
Copyright © 2020-2023  润新知