Php, mysql - Слишком много соединений с ошибкой базы данных

Добрый день для всех. У меня странная ошибка. Я создал чат, который работает следующим образом:

  • вопросы/ответы вставляются в db
  • каждые 2 секунды запрос ajax отправляется на php script, который извлекает новые вопросы/ответы

Он работал нормально до сегодняшнего дня, когда я получил эту ошибку:

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1040] Too many connections' in /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php:129 
Stack trace: #0 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php(129): PDO->__construct('mysql:host=loca...', '', '', Array) 
s#1 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Mysql.php(96): Zend_Db_Adapter_Pdo_Abstract->_connect() 
s#2 /var/www/html/dbdev/include/Zend/Db/Adapter/Abstract.php(448): Zend_Db_Adapter_Pdo_Mysql->_connect() 
s#3 /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('select profile_...', Array) 
s#4 /var/www/html/dbdev/include/Zend/Db/Adapter/Abstract.php(782): Zend_Db_Adapter_Pdo_Abstract->query('select profile_...', Array) 
s#5 /var/www/html/dbdev/include/Profile.php(43): Zend_Db_Adapter_Abstract->fetchPairs('select profile_...') 
s#6 /var/www/html/dbdev/public_html/index.php(29): Profile->load() 
s#7 {main} Next exception 'Zend_Db_Adapter_Exception' with in /var/www/html/dbdev/include/Zend/Db/Adapter/Pdo/Abstract.php on line 144

Проблема в том, что мы не так много... (8), и я не думаю, что db не мог поддерживать более 8-16 соединений одновременно (по спецификациям написано, что чат должен поддерживать 50-100 пользователей поэтому 8... маленький).

Итак... может ли кто-нибудь сказать мне, почему это произошло (вчера нам было 15 и работало нормально) и как его решить? Спасибо за помощь. Если вам нужны какие-либо образцы кода, просто спросите.

Ответ 1

Существует множество причин для ошибки "слишком много подключений".

Ознакомьтесь с этой страницей часто задаваемых вопросов на сайте MySQL.com: http://dev.mysql.com/doc/refman/5.5/en/too-many-connections.html

Проверьте файл my.cnf на "max_connections". Если ничего не существует, попробуйте:

[mysqld]
set-variable=max_connections=250

Однако значение по умолчанию равно 151, поэтому вы должны быть в порядке.

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

Другие проблемы, которые нужно искать, это использование постоянных соединений и выход из дискового пространства.

Ответ 2

Ошибка SQLSTATE[HY000] [1040] Too many connections является ошибкой SQL и связана с сервером sql. Могут быть другие приложения, подключающиеся к серверу. Сервер имеет максимальный доступный номер подключения.

Если у вас есть phpmyadmin, вы можете использовать вкладку "variables", чтобы проверить, что такое параметр.

Вы также можете запросить таблицу статус следующим образом:

show status like '%onn%';

Или некоторые отклонения от этого. проверьте руководство, какие переменные есть

(помните, что "соединения" - это не текущие соединения, проверьте эту ссылку:))

Ответ 3

Если вы достигли предела подключения к Mac перейдите к /etc/my.cnf и в разделе [mysqld] добавьте max_connections = 500

и перезапустите MySQL.

Ответ 4

Проверьте, открываете ли вы новое соединение с каждым из ваших запросов (mysql_connect (...)). Если вы это сделаете, убедитесь, что впоследствии вы закрыли соединение (используя mysql_close ($ link)).

Кроме того, вам следует подумать об изменении этого поведения, так как поддержание одного устойчивого соединения для каждого пользователя может быть лучшим способом выполнить вашу задачу.

Если вы этого еще не сделали, взгляните на этот очевидный, но тем не менее полезный информационный ресурс: http://php.net/manual/function.mysql-connect.php

Ответ 5

Это может случиться из-за слишком большого количества подключений одновременно или большого количества чатов одновременно. Также это может произойти из-за слишком большого количества сеансов.

Лучший способ решить эту проблему - перезапустить MySQL.

service mysqld restart

или

service mysql restart

или

 /etc/init.d/mysqld restart