• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    php基于Redis消息队列实现的消息推送的方法

    基本知识点

    重点用到了以下命令实现我们的消息推送

    逻辑分析

    代码实现

    普通任务脚本

    ?php
    foreach ($user_list as $item) {
      //命名规则 业务类型_操作_ID_随机6位 值 自定义 我自定义的是"推送内容"
      $k_name = 'rabbit_push_' . $item['uid'].'_'.rand(100000,999999);
      $redis->lPush('push_queue',$k_name);//左进队列
      $redis->set($k_name, '推送内容');
    }
    

    RedisPushQueue

    ?php
    //消息队列处理推送~
    //
     // 守护进程运行
     // nohup php YOURPATH/RedisPushQueue.php  开启守护进程运行,修改文件之后需要从新启动
    // blpop 有值则回去 没值则阻塞 主要就是这个函数在起作用 不过并不安全,程序在执行过程中崩溃就会导致队列中的内容
     // 永久丢失~
     // BRPOPLPUSH 阻塞模式 右边出 左边进 在填写队列内容的时候要求从左进入
     //
    ini_set('default_socket_timeout', -1); //不超时
    require_once 'YOURPARH/Rongcloud.php';
    
    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->select(2);//切换到db2
    $redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
    
    // temp_queue临时队列防止程序崩溃导致队列中内容丢失 0代表永不超时!
    While ($key = $redis->brpoplpush('push_queue', 'temp_queue', 0)) {
      if ($val = $redis->get($key)) {
        //rabbit_push_20_175990
        $arr = explode('_', $key);
        if (count($arr) != 4) {
          continue;
        }
        $id = $arr[2];
        push($id, $val);
        //删除key内容
        $redis->del($key);
      } 
    }
    function push($id, $v)
    {
     //推送操作~
    }
    
    

    RedisAutoDeleteTempqueueItems

    ?php
    /* 自动处理temp_queue中的元素,这个操作是防止RedisPushQueue崩溃的时候做处理
     处理思路是 使用brpop 命令阻塞处理temp_queue这个队列中的值,如果能获取到"值"对应的"值",说明RedisPushQueue执行失败了
     将值还lpush到push_queue中,以备从新处理
     至于为什么使用brpop命令,是因为在RedisPushQueue中我们使用的是brpoplpush
     nohup php YOURPATH/RedisAutoDeleteTempqueueItems.php  开启守护进程运行,修改文件之后需要从新启动
    */
    ini_set('default_socket_timeout', -1); //不超时
    $redis = new \Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->select(2);//切换到db2
    $redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
      while($key_arr = $redis->brPop('temp_queue',0)){
      if(count($key_arr) != 2){
        continue;
      }
      $key =$key_arr[1];
      if($redis->get($key)){//能获取到值 说明RedisPushQueue执行失败
        $redis->lPush('push_queue',$key);
      }
    }
    

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 详解php微信小程序消息推送配置
    • php实现微信模板消息推送
    • php实现websocket实时消息推送
    • 微信小程序 消息推送php服务器验证实例详解
    • 解析php做推送服务端实现ios消息推送
    • php之app消息推送案例教程
    上一篇:php获取用户真实IP和防刷机制的实例代码
    下一篇:PHP中如何使用Redis接管文件存储Session详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    php基于Redis消息队列实现的消息推送的方法 php,基于,Redis,消息,队列,