Вопрос или проблема
Я создал плагин для 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 приложению, давайте рассмотрим возможные причины и пути их решения.
Причины возникновения ошибки
-
Тайм-аут соединения:
Когда запрос к базе данных занимает слишком много времени, сервер MySQL может закрыть соединение. Это обычно происходит, когда в базе данных находится большое количество данных или запрос является слишком громоздким. -
Максимальный размер пакета:
Если вы пытаетесь отправить или получить данные, превышающие значения, установленные в конфигурационных параметрах MySQL, это может тоже привести к данной ошибке. Параметрmax_allowed_packet
определяет максимальный размер пакета данных, который сервер допускает. -
Физическая память:
Если сервер недостаточно обеспечен памятью, это также может стать причиной ошибки. В частности, если происходит исчерпание ресурсов, MySQL может закрыть соединение. -
Использование too much data in JSON Response:
Если ваш ASP.NET API возвращает слишком большой объём данных, это также может вызвать проблемы при их обработке. Рассмотрите возможность ограничения объёма возвращаемых данных или оптимизации ответа.
Рекомендации по устранению
-
Увеличьте тайм-ауты:
Ваша текущая настройкаcurl_setopt($ch, CURLOPT_TIMEOUT, 75);
стоит довольно высоко. Попробуйте увеличить время ожидания или проанализировать, сколько времени действительно требуется на выполнение запроса. -
Настройка max_allowed_packet:
Увеличьте значение переменнойmax_allowed_packet
в конфигурации MySQL. Это можно сделать, добавив или изменив следующую строку в вашем файле конфигурации MySQL (my.cnf
илиmy.ini
):max_allowed_packet=64M
Не забудьте перезапустить MySQL после внесения изменений.
-
Оптимизация базы данных:
Проверьте базу данных на наличие фрагментации и выполните анализ и оптимизацию таблиц. Это может помочь улучшить производительность и уменьшить количество ресурсов, потребляемых при запросах. -
Обработка ответа API:
Убедитесь, что ваши данные не превышают разумный объём. Используйте пагинацию, если удаётся разбить результаты на меньшие объемы. Если это не применимо, оптимизируйте структуру данных или фильтруйте ненужные данные в запросе. -
Логи и диагностика:
Включите логирование ошибок на сервере, чтобы получать более подробную информацию об ошибках. Это даст вам больше контекста и поможет лучше понять, какие именно запросы приводят к сбоям. -
Обработка ошибок:
Добавьте проверку и обработку ошибок в ваш код pлагина. Например, перед выполнениемmysqli_query()
убедитесь, что соединение активно, и если эту ошибку ловите, повторно установите соединение и повторите запрос.
Заключение
Проблема MySQL server has gone away
вызывает много вопросов, и её решение зависит от множества факторов, включая конфигурацию вашего сервера, используемые данные и структуру запросов. Следуя вышеизложенным рекомендациям и анализируя окружение, вы сможете сузить круг причин и устранить эту ошибку.
Если после выполнения всех шагов проблема не решится, стоит также рассмотреть возможность обратиться к вашему хостинг-провайдеру за поддержкой, чтобы получить рекомендации, специфичные для их инфраструктуры.