收集了一批微信小程序的訂閱消息,現在要發送
如果直接從數據庫中獲取,循環發送,數量不多還好,數量一多,將極大占用服務器資源,甚至造成卡頓。
這個時候就要用到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'=>'隊列中無數據']); }