php批量处理问题

最近接到一个需求,批量发送短信,但是没有批量发送接口, 这样意味着我只能走单发的接口,1万个短信,就要走1万次了,如果一直让用户等下去,肯定是不好滴。苦心研究,出来了方法,贴在下面。

首先,上传excel,解读数据,并存入数据库,

接下来,去请求一个php文件,由于是一个耗时操作,我不等他返回,只发送请求过去,通知用户,已成功添加到后台任务。

   function sendMS($mass_id=''){
    if(!$mass_id)exit('hello,welcome!');
    $host = $_SERVER['SERVER_NAME'];
    $fp = fsockopen($host, 80, $errno, $errstr, 5);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $param = http_build_query(['mass_id'=>$mass_id]);
        $out = "GET /App/Public/sendM?".$param." HTTP/1.1\r\n";
        $out .= "Host: ".$host."\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
         usleep(1000); // 这一句也是关键,网络传输需要时间
        fclose($fp);
   //     echo '1';
    }
}

因为这个短信接口比较复杂,也不想复制,就复用前台的短信接口,

//前台的批量发送 
function sendM(){
    error_reporting(0);//防止报错信息暴露
    set_time_limit(0);
    $map['mass_id']=$_GET['mass_id'];
    if(!$map['mass_id'])exit('缺少关键值');
    $map['status']=3;
    $res = M('sms_mass_list')->where($map)->select();
    $content = M('sms_mass')->field('content')->find($map['mass_id'])['content'];
    ignore_user_abort(true); // 客户端关闭程序继续执行
    foreach($res as $k=>$v){
        $dataArr['mobile']=$v['mobile'];
        $dataArr['content']=$content;
        $tmpRes=R('App/index/sendM',$dataArr);
        if($tmpRes){
            $v['status']=1;
            M('sms_mass_list')->save($v);
        }else{
            $v['reason']= '网络或其他原因';//接口暂时不能返回失败原因
            $v['send_time'] = date('Y-m-d H:i:s');
            M('sms_mass_list')->save($v);
        }
    }
}

这样执行的话,就相当于讲任务添加到后台了,即使用户关闭浏览器,关闭窗口,这个程序依然会执行,除非php down掉或者重启,不然这个任务会执行下去。

2017-02-16 11:48:54
nickname
content