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

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

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

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

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 и работало нормально) и как его решить? Спасибо за помощь. Если вам нужны какие-либо образцы кода, просто спросите.

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

Ознакомьтесь с этой страницей часто задаваемых вопросов на сайте 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, поэтому вы должны быть в порядке.

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

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

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

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

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

 show status like '%onn%'; 

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

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

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

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

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

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

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

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

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

 service mysqld restart 

или

 service mysql restart 

или

  /etc/init.d/mysqld restart