РЕДАКТИРОВАТЬ : Уже исправили ошибку Creating default object from empty value
, Мой вопрос сейчас только предложения, как сделать этот процесс лучше.
Я делаю инструмент, который отправляет пакетный запрос API на определенный URL. я использую https://github.com/stil/curl-easy для пакетного запроса API Этот API проверит номера телефонов, которые я отправляю, и вернет результат. Этот API может поддерживать максимум 20 запросов в секунду. Предполагается, что у меня 50 000 запросов 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');
}
Так как максимум составляет 20 запросов в секунду, я просто делаю это 13 запросов в секунду, просто чтобы быть уверенным, что я не засорю их сервер. Я добавляю sleep(2);
немного сделать паузу, чтобы я мог убедиться, что очередь полностью обработана, прежде чем двигаться дальше.
Задача ещё не решена.
Других решений пока нет …