Разрабатываю интеграцию приложения с API сервиса рассылок на Yii basic. Столкнулся с проблемой при вставке большого количества записей (ответа от API) в БД Mysql.
Алгоритм такой:
1) получаю все емэйлы подписчиков (более 1000 записей),
2) делаю запрос на получение XML-информации от API по каждому емэйлу,
3) Пытаюсь сохранить все данные в таблицу с помощью Active Record.
Использую для этого консольную команду Yii2, но после нескольких минут скрипт падает с ошибкой 'Error while sending QUERY packet.'
Подскажите, пожалуйста, как можно решить это проблему?
Вот код экшена:
class StartAction extends Action{
public function run(){
$uniqEmails = $activitiesComp->getUniqueEmails(); // emails array
$feedHelper = new FeedHelper([
'apiKey' => $value,
'apiHost' => $key,
'date' => $this->date,
'columns' => 'Extended',
]);
$XMLSubscriberArr = [];
foreach ($uniqEmails as $email) {
$XMLSubscriberArr[] = $feedHelper->getSubscriberInfo($email);
}
foreach ($XMLSubscriberArr as $XMLSubscriberInfo) {
$parsedSubscriber = new SimpleXMLElement($XMLSubscriberInfo);
$subscriberEmail = (string) $parsedSubscriber->Data->Email;
if (!$subscribersModel = $subscribersComp->getSubscriberByEmail($subscriberEmail)) {
$subscribersModel = $subscribersComp->getModel();
}
$subscribersModel->ip = (string)$parsedSubscriber->Data->Ip;
$subscribersModel->email = $subscriberEmail;
$subscribersModel->first_name = (string) $parsedSubscriber->Data->Firstname;
$subscribersModel->second_name = (string) $parsedSubscriber->Data->Lastname;
$properties = $parsedSubscriber->Data->Properties;
foreach ($properties->Property as $property) {
if ($property->Name == "custom_id") {
$subscribersModel->sem_id = (int) $property->StringValue;
}
}
$subscribersModel->save();
}
echo 'Success';
return ExitCode::OK;
}
}
Код класса для работы с API:
class FeedHelper
{
public $apiKey;
public $apiHost;
public $date;
public $columns;
public function __construct($params)
{
$this->apiKey = $params['apiKey'];
$this->apiHost = $params['apiHost'];
$this->date = $params['date'];
$this->columns = $params['columns'];
}
public function getSubscriberInfo($email)
{
$params = [
'apiKey' => $this->apiKey,
'email' => $email,
'option' => 'full',
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $this->apiHost . 'Api/Subscribers/?' . http_build_query($params));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
}
Уже пробовал менять в конфиге БД:
'max_allowed_packet' = 512M
Также смотрел в сторону параметров max_questions, max_updates, max_connections, max_user_connections, max_statement_time таблицы mysql.user. Но каждый из них равен нулю, ограничений нет.
Где еще нужно искать проблему?