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