Этот вопрос закрыт для ответов, так как повторяет вопрос Почему возникает Error while sending QUERY packet в MariaDb?
@disSpector

Как избавиться от ошибки mysql 'Error while sending QUERY packet.'?

Разрабатываю интеграцию приложения с 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. Но каждый из них равен нулю, ограничений нет.

Где еще нужно искать проблему?
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
@402d
начинал с бейсика на УКНЦ в 1988
https://github.com/yiisoft/yii2/issues/12680
I have no good solution to that right now but you could measure the time and manually reconnect if your script has run longer than 30sec.
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы