PHP 使用redis隊列批量發送


收集了一批微信小程序的訂閱消息,現在要發送

如果直接從數據庫中獲取,循環發送,數量不多還好,數量一多,將極大占用服務器資源,甚至造成卡頓。

這個時候就要用到redis的隊列異步發送了。

直接上代碼,本示例使用YII2框架

        //獲取數據
        $subArr=XcxSubscribe::find()->where(['title'=>$title,'status'=>0])->orderBy('id desc')->asArray()->all();
        //將數據插入隊列
        $redis=Yii::$app->redis;
        $redis->select(2);//選擇redis數據庫
        if (!empty($subArr)){
            foreach ($subArr as $k=>$v){
                 $redis->rpush($title,json_encode($v));//將每一條數組插入到隊列,等待發送
            }
        }else{
            return Json::encode(['code'=>400,'msg'=>'無數據']);
        }

        $messages=$redis->lrange($title,0,-1);//將隊列中的數據取出來
        //var_dump($messages);exit;

        if (!empty($messages)){
            //循環發送
            foreach ($messages as $k=>$v){
                $message=json_decode($v,true);
                $dataArr=array(
                    "touser"=>$message['openid'], //接收用戶的openid
                    "template_id"=>$message['template_id'],  //模板id
                    "page"=>$message['page'],//點擊模板消息跳轉至小程序的頁面   支持帶參數,(示例index?foo=bar)
                    "data"=>$conArr
                );

                //var_dump($dataArr);exit;
                $res=$this->curl($subscribeUrl,$params=json_encode($dataArr),$ispost=1,$https=1); 
                //失敗
                if (stripos($res,'4')){
                    //失敗的
                    array_push($openidArr,$message['openid']);
                }else{
                    //成功的
                    array_push($sopenidArr,$message['openid']);
                }

                //從隊列中刪除
                $redis->lrem($title,0,$v);
            }

            return Json::encode(['code'=>200,'msg'=>'發送成功','data'=>[
                'openidArr'=>$openidArr,
                'sopenidArr'=>$sopenidArr,
            ]]);

        }else{
            return Json::encode(['code'=>400,'msg'=>'隊列中無數據']);
        }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM