mysqli_query(): MySQL сервер отключился при запросе Curl

Вопрос или проблема

Я создал плагин для WordPress, который после активации отображает результат в jQuery DataTable. Мы получаем результат через CURL Post. URL-адрес Post – это приложение ASP.Net на сервере Windows.

Плагин создан для моего клиента, который испытывает следующую ошибку после добавления моего шорткода в запись.

Клиент использует Divi от Elegant Themes (последняя версия), WordPress 5.2.2, работающий на Apache / PHP 7.2.21

Эта ошибка отображается только на той странице записи, где добавлен шорткод:

Warning: mysqli_query(): MySQL server has gone away in /homepages/10/d241347454/htdocs/wp-includes/wp-db.php on line 2007**

Warning: mysqli_query(): Error reading result set’s header in /homepages/10/d241347454/htdocs/wp-includes/wp-db.php on line 2007**

Вот мой код плагина:

 $atts = shortcode_atts(
            array(

                'secretkey' => ''
            ),
            $atts,
            'MySecretKeyCaption'
        );

        $thisoptions = get_option( 'MySecretKeySettings' );

         $url="https://sub.someASPnetWebsite.com/api/TestimonialList";  
        $webApiUn = $thisoptions['webApiUn'];
        $webApiPwd = $thisoptions['webApiPwd'];
        $webApisecretkey = $atts['secretkey'];

        $data = array('webApiUn' => $webApiUn, 'webApiPwd' => $webApiPwd, 'SecretKey' => $webApisecretkey);
    $data_string = json_encode($data);

    $ch = curl_init($url);

    //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
    );
    curl_setopt($ch, CURLOPT_TIMEOUT,75);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);

    //execute post
    $result = curl_exec($ch);

    $endresult = json_decode($result);

foreach ($endresult->reviews->review as $key=>$value) {?>
<tr>
<td><?php echo time_elapsed_string($endresult->reviews->review[$key]->datePublished); ?></td>
<td> <?php echo $endresult->reviews->review[$key]->rating; ?></td>

<td>More Data....</td>
</tr>
<?php } ?>

Я не могу воспроизвести ошибку, о которой сообщает мой клиент. У меня всё работает как надо.

Пожалуйста, подскажите, как это можно исправить.

Пожалуйста, обратитесь к этому тикету.
https://wordpress.org/support/topic/warning-mysqli_query-mysql-server-has-gone-away/#topic-9911138-replies

Это связано с исчерпанием памяти MySQL, из-за большого размера базы данных или, возможно, малого размера пакета памяти.

Ответ или решение

Проблема с ошибкой mysqli_query(): MySQL server has gone away может возникать по многим причинам. В контексте вашего WordPress плагина, который выполняет запросы через CURL к ASP.NET приложению, давайте рассмотрим возможные причины и пути их решения.

Причины возникновения ошибки

  1. Тайм-аут соединения:
    Когда запрос к базе данных занимает слишком много времени, сервер MySQL может закрыть соединение. Это обычно происходит, когда в базе данных находится большое количество данных или запрос является слишком громоздким.

  2. Максимальный размер пакета:
    Если вы пытаетесь отправить или получить данные, превышающие значения, установленные в конфигурационных параметрах MySQL, это может тоже привести к данной ошибке. Параметр max_allowed_packet определяет максимальный размер пакета данных, который сервер допускает.

  3. Физическая память:
    Если сервер недостаточно обеспечен памятью, это также может стать причиной ошибки. В частности, если происходит исчерпание ресурсов, MySQL может закрыть соединение.

  4. Использование too much data in JSON Response:
    Если ваш ASP.NET API возвращает слишком большой объём данных, это также может вызвать проблемы при их обработке. Рассмотрите возможность ограничения объёма возвращаемых данных или оптимизации ответа.

Рекомендации по устранению

  1. Увеличьте тайм-ауты:
    Ваша текущая настройка curl_setopt($ch, CURLOPT_TIMEOUT, 75); стоит довольно высоко. Попробуйте увеличить время ожидания или проанализировать, сколько времени действительно требуется на выполнение запроса.

  2. Настройка max_allowed_packet:
    Увеличьте значение переменной max_allowed_packet в конфигурации MySQL. Это можно сделать, добавив или изменив следующую строку в вашем файле конфигурации MySQL (my.cnf или my.ini):

    max_allowed_packet=64M

    Не забудьте перезапустить MySQL после внесения изменений.

  3. Оптимизация базы данных:
    Проверьте базу данных на наличие фрагментации и выполните анализ и оптимизацию таблиц. Это может помочь улучшить производительность и уменьшить количество ресурсов, потребляемых при запросах.

  4. Обработка ответа API:
    Убедитесь, что ваши данные не превышают разумный объём. Используйте пагинацию, если удаётся разбить результаты на меньшие объемы. Если это не применимо, оптимизируйте структуру данных или фильтруйте ненужные данные в запросе.

  5. Логи и диагностика:
    Включите логирование ошибок на сервере, чтобы получать более подробную информацию об ошибках. Это даст вам больше контекста и поможет лучше понять, какие именно запросы приводят к сбоям.

  6. Обработка ошибок:
    Добавьте проверку и обработку ошибок в ваш код pлагина. Например, перед выполнением mysqli_query() убедитесь, что соединение активно, и если эту ошибку ловите, повторно установите соединение и повторите запрос.

Заключение

Проблема MySQL server has gone away вызывает много вопросов, и её решение зависит от множества факторов, включая конфигурацию вашего сервера, используемые данные и структуру запросов. Следуя вышеизложенным рекомендациям и анализируя окружение, вы сможете сузить круг причин и устранить эту ошибку.

Если после выполнения всех шагов проблема не решится, стоит также рассмотреть возможность обратиться к вашему хостинг-провайдеру за поддержкой, чтобы получить рекомендации, специфичные для их инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...