由于php自带的curl_muti请求如果并发量太大会出现浏览器卡死响应太慢的问题,设计目的主要是在浏览器响应的120s之内完成短信的群发。
所以利用消息队列来解决大并发的curl请求。
设计思路
将前台传来的手机号存入数组->是否大于队列最大长度->如果大于返回false,否则将手机号存入队列中
->从队列中取出m条数据并用curl_multi_init方式发送请求->无限循环上一步直到队列长度为0->清空队列,释放缓存
代码如下:
function muti_send($mobile_array,$text,$max=10000){ if(count($mobile_array)>$max){return false;}//判断数组长度是否超过队列最大长度 $memque = new memqueue('group',600);//设置队列缓存过期时间10分钟 foreach ($mobile_array as $key=>$value){ //取出电话添加到队列 $memque->add($value); } $len=$memque->getQueueLength();//获取队列长度 while ($len>0){ $data=$memque->get(200);//每次取出200条数据 foreach ($data as $k=>$v){ $mobile[]=$v; }//取出数值放入数组中 $this->muti_send_curl($mobile, $text);//发送请求 unset($mobile);//清空当前循环次数的数组 $len=$memque->getQueueLength();//获得当前队列长度 } $memque->clear();//清空队列 memcache_flush();//清除缓存 }
经过测验后队列长度最大为10000,每次发送200条请求为最佳,10000条短信群发只需81s左右