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)
暂停一点,以便在继续之前确保队列已完全处理