Ошибка max user connections в MySQL
Когда Ваш сайт (на PHP и MySQL) становится достаточно популярным, то время от времени у Вас будет появляться ошибка превышения количества одновременных подключений к базе данных (max user connections). Это происходит по той причине, что одновременно несколько посетителей делает запрос к базе данных. Как правило, у обычного хостинга - это максимум 5-7 одновременных соединений к базе данных. В этой статье я расскажу, как свести вероятность появления этой ошибки к самому минимуму.
Первым делом, Вы должны исправить код:
- Всегда закрывать соединения с базой данных.
- Добиться того, чтобы при загрузке одной страницы создавалось только одно соединение. Эта ошибка особенно часто встречается при ООП, поскольку зачастую в каждом объекте создаётся своё соединение с базой. Это в корне неправильно и нужно 1 раз вначале соединиться с базой данных, а потом передавать объект (или идентификатор соединения) через конструктор в каждый объект.
Это были технические ошибки, которые программисты очень часто совершают. Однако, и устранения этих ошибок, увы, бывает недостаточно. Здесь есть два выхода: купить более дорогой хостинг (или даже выделенный сервер), либо пойти на маленькую хитрость.
Хитрость заключается в определении "max user connections". Фактически, жёсткое ограничение на количество соединений лежит на ОДНОМ пользователе. А поскольку, как правило, к базе обращается только 1 пользователь, то он и вынужден одновременно обрабатывать кучу запросов от разных посетителей. Решение очень простое. Надо создать несколько пользователей базы данных и в движке сайта случайным образом выбирать пользователя, который будет обращаться к базе. Таким образом, нагрузка уменьшится в несколько раз. А фактическое количество допустимых одновременных соединений возрастёт в несколько раз. Безусловно, до бесконечности создавать пользователей нельзя, поскольку ограничение на суммарное количество одновременных соединений от всех пользователей тоже имеется. Но эта цифра, как правило, в районе 100, что, разумеется, уже не 5-7.
В результате, Вы можете держать очень посещаемый сайт на вполне недорогом хостинге.
-
- Михаил Русаков
Комментарии (28):
Хитро!
Ответить
А сколько стоит примерно аренда сервера?
Ответить
Аренда именно физического сервера около 100$ в месяц
Ответить
Достаточно и виртуального сервера, например https://bitweb.ru/vps.html
Ответить
Прошу разъяснить: "Надо создать несколько пользователей базы данных и в движке сайта случайным образом выбирать пользователя, который будет обращаться к базе". Я так понимаю, что надо создать несколько пользователей базы данных MySQL. А вот каким образом сделать что бы они выбирались случайным образом в движке сайта при обращении к базе??? Использую Joomla15
Ответить
В файле configuration.php добавьте массив с именами пользователей ($users), а в константе, отвечающей за пользователя: mt_rand(0, count($this->users) - 1); и сам пользователь = $users[$n_user]
Ответить
Не совсем понял. в файле есть var $user = 'hosting_admin'; Мне нужно добавить таких юзеров? Это и будет массив или массив добавляется по другому? (я только начинаю разбираться)
Ответить
Понимаю так: пишем $users = 'hosting_admin' 'hosting_user1' 'hosting_user2'; потом $mt_rand(0, count($this->users) - 1); далее $user = $users[$n_user]; Правильно?
Ответить
var $users = array("hosting_admin", "hosting_user1", "hosting_user2"); - это как массив объявить.
Ответить
Вот это: mt_rand(0, count($this->users) - 1); где и как писать?
Ответить
var $n = mt_rand(0, count($this->users) - 1); var $user = $this->users[$n]; А вообще PHP надо знать для решения такой задачи.
Ответить
А на DLE можно сделать? Если можно то как?
Ответить
Можно, я думаю, что где-то есть файл configuration.php или config.php, вот его-то и нужно отредактировать.
Ответить
Есть такой файл dbconfig.php, и там содержится: define ("DBHOST", "localhost"); define ("DBNAME", "test1"); define ("DBUSER", "test1"); define ("DBPASS", "test1"); define ("PREFIX", "dle"); define ("COLLATE", "cp1251"); define ("USERPREFIX", "dle"); $db = new db; Получается его редактировать надо?
Ответить
Да, его.
Ответить
if(mt_rand(1,2)==1) {//коннект через одного юзера } else { коннект через другого } Примерно так надо? Проконсультируй пожалуйста!
Ответить
Михаил, добрый день! Помогите пожалуйста: перепробовал много вариантов, таких как Ваш: var $users = array("root", "boot", "foot"); var $n = mt_rand(0, count($this->users) - 1); var $user = $this->users[$n]; такой: http://stackoverflow.com/questions/20244066/several-mysql-users-in-joomla-1-5-configuration-php но все выдают "Parse error: syntax error". В первом случае это Parse error: syntax error, unexpected '(', expecting ',' or ';' in configuration.php on line 41 Подскажите пожалуйста, где ошибка?
Ответить
Здравствуйте, Владимир. Ошибка в синтаксисе, внимательно проверьте.
Ответить
я уже перепробовал все версии размножения пользователей, которые смог найти в интернете; пробовал mt_rand и array_rand, пробовал выбирать из массива по индексу: var $user = $this->users[1]; но все варианты приводят либо к unexpected T_VARIABLE либо к unexpected '('
Ответить
Еще раз повторюсь, у Вас ошибки в синтаксисе. Проверьте ";", "", '' , {,}. на недостающие.
Ответить
Благодарю за помощь, проблему решил добавлением функции: var $user = ''; var $users = array("root", "boot", "foot"); public function __construct() { $this->user = $this->users[mt_rand(0, count($this->users) - 1)]; } Я не силен в php, но видимо проблема была в том, что я пытался вызвать функцию в объявлении переменных класса...
Ответить
Все консультация не нужна, все сделал, работает =). Спасибо за идею!
Ответить
Здравствуйте, Михаил А для сайта на wordpress что и где прописать для меня ваш хитрый ход может быть спасательным кругом,хостинг закрыл мой сайт, как раз из за перегрузки сервера, купить выделенный нет возможности вот читаю ваши статьи уже второй день думаю эта хитрость мне помогла бы но я полный ноль мне надо знать куда и где после чего или до чего вставлять(для реализации этой штуки)возможно пользователей смогу наштамповать в phpmyadmin искал информацию по оптимизации долго в разных местах а нашёл у себя на почте оказывается я ваш подписчик вот начал читать, читаю с большим интересом но сайт закрыт уже больше недели (просьба закиньте в моё болото спасательный круг)я буду очень благодарен Вам.
Ответить
Я не работаю с готовыми движками http://myrusakov.ru/php-engine-vs-null.html А исправлять нужно где-то в конфигурационном файле. Но без знаний по PHP не получится.
Ответить
А десяти пользователей хватит для того, чтобы обеспечить максимально возможную нагрузку на хостинг?
Ответить
да хватит и одного) продублируйте запрос раз этак 400 и увидите) или вы имеете в виду пользователей БД если да,то это не столь важно и вообще всё зависит от дозволенных ресурсов хостера на ваш аккаунт =)
Ответить
Но я не думаю, что дозволенные ресурсы хостера позволят различным посетителям безгранично загружать страницы используя только одного пользователя БД. Потому и спросил, может кто слышал об этом.
Ответить
защит много от этого)вообще то,что нагрузка велика - всё от плохой оптимизации. а положить сайт,как я уже говорил,может и один пользователь) например,сделайте сто новостей,и для каждой вывод из бд - отдельным запросом,с предварительным входом в базу для каждого и попробуйте зайти на такой сайт на хостинге =)
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.