Php 处理批量API请求的最佳方法Lavel 5

Php 处理批量API请求的最佳方法Lavel 5,php,api,laravel,batch-processing,laravel-5.1,Php,Api,Laravel,Batch Processing,Laravel 5.1,编辑:已修复从空值创建默认对象的错误。我现在的问题只是建议如何使这个过程更好 我正在制作一个工具,将批处理API请求发送到某个URL。我正在使用批处理API请求,API将验证我发送的电话号码并返回结果。那个API每秒最多可以支持20个请求,假设我有50000个API请求,处理事情的最佳和最快的方法是什么 当前的过程是,我向数据库查询我拥有的记录数,即电话号码。然后我用电话号码做一个循环。在一次迭代中,我将从数据库中查询13条记录,然后将其传递给队列并对其进行处理,处理完成后,我将再次查询数据库,

编辑:已修复从空值创建默认对象的错误
。我现在的问题只是建议如何使这个过程更好

我正在制作一个工具,将批处理API请求发送到某个URL。我正在使用批处理API请求,API将验证我发送的电话号码并返回结果。那个API每秒最多可以支持20个请求,假设我有50000个API请求,处理事情的最佳和最快的方法是什么

当前的过程是,我向数据库查询我拥有的记录数,即电话号码。然后我用电话号码做一个循环。在一次迭代中,我将从数据库中查询13条记录,然后将其传递给队列并对其进行处理,处理完成后,我将再次查询数据库,并根据API响应更新电话号码字段。我的问题是,我认为我的循环中有一个逻辑错误,当我运行此程序时,处理将停止一段时间,并给出:

Creating default object from empty value
我想这是因为我的循环,这是我的代码

public function getParallelApi()
{

    $numItems = DB::connection('mysql')->select("SELECT COUNT(ID) AS cnt FROM phones WHERE status IS NULL");

    for($y = 0; $y < $numItems[0]->cnt; $y++)
    {
        $queue = new \cURL\RequestsQueue;
        // Set default options for all requests in queue
        $queue->getDefaultOptions()
        ->set(CURLOPT_TIMEOUT, 5)
        ->set(CURLOPT_RETURNTRANSFER, true)
        ->set(CURLOPT_SSL_VERIFYPEER, false);


        // This is the function that is called for every completed request
        $queue->addListener('complete', function (\cURL\Event $event) {
            $response = $event->response;
            $json = $response->getContent(); // Returns content of response
            $feed = json_decode($json, true);

            $phone_number = $feed['msisdn'];
            if(isset($phone_number))
            {
                $status = "";$remarks = "";$network = ""; $country = "";$country_prefix = "";

                if(isset($feed['status']))
                {
                    $status = $feed['status'];
                }

                if(isset($feed['network']))
                {
                    $network = $feed['network'];
                }

                if(isset($feed['country']))
                {
                    $country = $feed['country'];
                }

                if(isset($feed['country_prefix']))
                {
                    $country_prefix = $feed['country_prefix'];
                }

                if(isset($feed['remark']))
                {
                    $remarks = $feed['remark'];
                }

                $update = Phone::find($phone_number);
                $update->network = $network;
                $update->country = $country;
                $update->country_prefix = $country_prefix;
                $update->status = $status;
                $update->remarks = $remarks;
                $update->save();
            }

        });


        // Get 13 records
        $phone = DB::connection('mysql')->select("SELECT * FROM phones WHERE status IS NULL LIMIT 13");
        foreach ($phone as $key => $value) 
        {    
            $request = new \cURL\Request($this->createCurlUrl($value->msisdn));
           // var_dump($this->createCurlUrl($value->msisdn)); exit;
            // Add request to queue
            $queue->attach($request);
        }

        // Process the queue
        while ($queue->socketPerform()) {
            $queue->socketSelect();
        }


        sleep(2);
        $y += 13; // Move to the next 13 records
    }

    Session::flash('alert-info', 'Data Updated Successfully!');
    return Redirect::to('upload');

}
公共函数getParallelApi() { $numItems=DB::connection('mysql')->select(“从状态为NULL的手机中选择COUNT(ID)作为cnt”); 对于($y=0;$y<$numItems[0]->cnt;$y++) { $queue=new\cURL\requestsque; //为队列中的所有请求设置默认选项 $queue->getDefaultOptions() ->设置(CULLOPT_超时,5) ->设置(CULLOPT_RETURNTRANSFER,真) ->设置(CULLOPT_SSL_VERIFYPEER,false); //这是为每个完成的请求调用的函数 $queue->addListener('complete',函数(\cURL\Event$Event){ $response=$event->response; $json=$response->getContent();//返回响应的内容 $feed=json_decode($json,true); $phone_number=$feed['msisdn']; if(isset(电话号码)) { $status=“”;$comments=“”;$network=“”;$country=“”;$country_prefix=“”; 如果(isset($feed['status'])) { $status=$feed['status']; } 如果(isset($feed['network'])) { $network=$feed['network']; } 如果(isset($feed['country'])) { $country=$feed['country']; } 如果(isset($feed['country_prefix'])) { $country_prefix=$feed['country_prefix']; } 如果(isset($feed['remark'])) { $备注=$feed['remark']; } $update=Phone::find($Phone\u number); $update->network=$network; $update->country=$country; $update->country\u prefix=$country\u prefix; $update->status=$status; $update->comments=$comments; $update->save(); } }); //获得13张唱片 $phone=DB::connection('mysql')->select(“从状态为NULL LIMIT 13的电话中选择*); foreach($phone as$key=>$value) { $request=new\cURL\request($this->createCurlUrl($value->msisdn)); //var_dump($this->createCurlUrl($value->msisdn));退出; //将请求添加到队列 $queue->attach($request); } //处理队列 而($queue->socketPerform()){ $queue->socketSelect(); } 睡眠(2); $y+=13;//移动到下一个13条记录 } 会话::flash('alert-info','Data Updated Successfully!'); 返回重定向::到('upload'); }
因为最大值是每秒20个请求,所以我只是每秒13个请求,以确保不会阻塞他们的服务器。我添加了
sleep(2)
暂停一点,以便在继续之前确保队列已完全处理