Вопрос или проблема
В настоящее время я получаю эту ошибку только на фронт-энде (не в /wp-admin):
Предупреждение: mysqli_real_connect(): (HY000/1203): Пользователь xxx уже имеет более
'max_user_connections' активных подключений в
/hermes/.../public_html/myhome/wp-includes/wp-db.php на строке 1489
Предупреждение: mysql_connect(): Пользователь xxx уже имеет более
'max_user_connections' активных подключений в
/hermes/.../public_html/myhome/wp-includes/wp-db.php на строке 1515
Ошибка при установлении соединения с базой данных
И мне интересно, как это возможно, если я единственный посетитель? Я использую WP 4.5.
Я связался с хостингом, который любезно ответил следующим образом:
В настоящее время ваш сайт показывает
'Ошибка при установлении соединения с базой данных'
потому что пользователь базы данных превысил
лимит одновременных подключений для
пользователя базы данных, который составляет 10. Это
и есть причина, почему сайт загружает
ошибку базы данных. Скрипт выдает
ошибку одновременного подключения, когда
число подключений к базе данных
превышает лимит, установленный на сервере. На
нашем общем сервере мы допускаем
максимум 10 одновременных
подключений к базе данных, что является
идеальным для общего сервера, и увеличить этот лимит
не представляется возможным.
Лимит запросов для вашего сайта будет
сброшен в течение нескольких часов, так что
вы сможете получить доступ к базе данных
через пару часов.
Существуют два случая, когда скрипт показывает
вышеуказанную ошибку: один из них возникает, когда
на сайт поступает высокий трафик, и
одновременные подключения к базе данных достигают
лимита, а второй случай - когда
подключение к базе данных не закрыто в
скрипте, даже при умеренном
трафике скрипт выдает ошибку
одновременного подключения. Чтобы преодолеть эту
проблему, вам нужно закрывать
подключение к базе данных сразу после
извлечения необходимого содержимого из
базы данных. Для закрытия подключения к базе данных вы можете
использовать функцию
mysql_close() PHP с
параметром подключения. Это поможет
вам эффективно использовать лимит
подключений к базе данных.
Иными словами, с нашей стороны все в порядке, это ошибка WP.
Это не связано с WordPress, поэтому я не уверен, имею ли я право отвечать здесь, но все же увеличьте max_user_connections
в файле конфигурации my.cnf MySQL, так как вы просто тестируете.
Существует множество причин исчерпания подключений, наиболее распространенные из которых связаны с тем, что веб-сервер/приложение создают неожиданно большое количество подключений из-за неправильной конфигурации или из-за какого-то скрипта, который «подает» соединения или создает слишком много подключений по ошибке.
Решение: некоторые люди увеличивают max_connections
до очень высокого значения, чтобы MySQL никогда не исчерпал подключения.
Однако это может вызвать проблемы с использованием ресурсов, съедая память и заставляя сервер MySQL переключаться на своп или быть убитым процессом OOM killer, или вызывать очень низкую производительность из-за высокой конкурентности.
Сначала вы хотите включить ошибки для $wpdb
, абстракции базы данных WP:
$GLOBALS['wpdb']->show_errors;
Иначе ни одно из ваших подключений к БД не исчезнет и не прервется с экземпляром \WP_Error
. Код ошибки по умолчанию – 500
.
Следующая ошибка возникает из \wpdb::db_connect()
:
Ошибка при установлении соединения с базой данных
Есть два случая, когда db_connect()
используется:
- Подключение к БД
- Проверить, есть ли соединение с базой данных
Только первый случай допускает прерывание. Если соединение будет потеряно, когда выполняется только проверка, оно не исчезнет и не вызовет эту ошибку. Теперь соединение осуществляется с помощью \wpdb_driver::connect()
, которая проверяет, доступно ли соединение. Это говорит вам о том, что ваша настоящая проблема действительно заключается в самом подключении. Вы можете взглянуть на это (без шуток) в следующем файле:
# interface-wp-db-driver.php
<?php
abstract class wpdb_driver {
Лучше не думайте о том, существует ли какая-либо связь между общим качеством кода WP core и глубокой понимании интерфейсов и абстрактных классов здесь.
Прямо перед тем, как соединение с БД будет объявлено “неудачным” и ошибка будет выдана, есть одна приятная строка:
require_once WP_CONTENT_DIR . '/db-error.php';
Это означает, что перед тем, как все умрет
, загружается Drop In. Вы можете использовать это и начать отладочный механизм там. У вас есть полный WP core доступен там. Вы можете начать отправлять себе электронные письма, фиксировать эти ошибки в ELK/Kibana, Spark или другом стекe, в каком-то SaaS или даже в Slack (или просто в текстовый файл). Заносите свои ошибки туда, фиксируйте, что происходит, сбрасывайте маршруты, запросы, детали подключения к БД, что угодно, что, как вы думаете, может вам помочь.
Веб-серверы являются многозадачными… Предполагая, что ваша тема не пытается получить доступ к БД напрямую (не через класс WPDB), каждое соединение пользователя должно соответствовать времени обработки запроса, который обрабатывает WP.
Предполагая это, у вас, вероятно, медленная обработка каждого запроса, в сочетании с несколькими запросами, обрабатываемыми “одновременно”, что может происходить, если ваша тема динамически загружает содержимое с помощью AJAX.
(это в основном то, что ваш хостинг сказал вам, что имеет смысл)
Ответ или решение
Причины предупреждения "max_user_connections" на фронтенде WordPress
При возникновении предупреждений, связанных с max_user_connections
, пользователи WordPress могут столкнуться с ошибками соединения с базой данных, аналогичными следующим:
Warning: mysqli_real_connect(): (HY000/1203): User xxx already has more than 'max_user_connections' active connections
Error establishing a database connection
В этом ответе мы подробно рассмотрим, что вызывает эту проблему на фронтенде вашего сайта на базе WordPress, а также предложим возможные решения.
1. Понимание ограничения max_user_connections
Сообщение об ошибке указывает на то, что учетная запись пользователя базы данных вашего сайта превысила максимальное количество активных соединений, установленных на сервере. На многих хостинг-площадках, особенно с совместным размещением, для защиты ресурсов в целях предотвращения злоупотреблений устанавливается ограничение на количество одновременных соединений. В данном случае ваше ограничение установлено на 10 соединений.
2. Причины превышения лимита соединений
Несмотря на то, что вы можете быть единственным посетителем вашего сайта, превышение лимита соединений может происходить по нескольким причинам:
-
Не закрытые соединения: Если в вашем коде или плагинах соединения с базой данных не закрываются должным образом, они могут накапливаться, достигая лимита.
-
Слишком много запросов: Некоторые темы и плагины могут отправлять множество запросов к базе данных, особенно если они используют AJAX для динамической загрузки контента или выполняют несколько запросов при открытии страницы.
-
Медленная обработка запросов: Если ваши запросы к базе данных обрабатываются медленно, существует вероятность, что одновременно активны несколько соединений, создавая эффект "протечки" соединений.
3. Рекомендации по решению проблемы
Вот несколько рекомендаций, которые могут помочь устранить проблему с превышением max_user_connections
:
-
Оптимизация подключения к базе данных: Убедитесь, что все соединения с базой данных закрываются после завершения работы. Используйте функции, такие как
mysql_close()
, чтобы закрыть соединения, когда они больше не нужны. -
Профилирование производительности: Проведите анализ производительности вашего сайта. Некоторые плагины могут вызывать избыточные запросы. Попробуйте отключить плагины один за другим, чтобы выявить потенциальных виновников.
-
Кэширование: Используйте кэширование на уровне страниц или объектов, чтобы сократить количество запросов к базе данных. Плагины кэширования, такие как W3 Total Cache или WP Super Cache, могут значительно уменьшить нагрузку на базу данных.
-
Мониторинг активности базы данных: Ведение журнала ошибок и мониторинг активности базы данных помогут выявить аномалии в поведении приложения и источники избыточных соединений.
4. Альтернативные решения
Если вышеуказанные меры не приводят к исправлению ситуации, вы можете рассмотреть следующие альтернативные варианты:
-
Переход на выделенный хостинг: Если вы регулярно сталкиваетесь с проблемами превышения лимита соединений, подумайте о смене хостинга на тарифный план с выделенными ресурсами, который не накладывает строгих ограничений на количество соединений.
-
Обращение к хостинг-провайдеру: Поскольку некоторые ограничения могут быть изменены только на уровне хостинга, после анализа проблемы (и, возможно, её решения на вашей стороне) вы можете обсудить возможность увеличения лимита с вашим провайдером.
Заключение
Ошибки, связанные с max_user_connections
, могут быть неприятными для пользователей WordPress и отразиться на доступности вашего сайта. Они обычно возникают в результате неправильного управления соединениями с базой данных или особенностей работы вашего приложения. Применение предлагаемых рекомендаций позволит вам минимизировать вероятность возникновения подобных проблем в будущем и обеспечит бесперебойную работу вашего ресурса.