Приложение Zend Framework не закрывает соединения mysql правильно

У меня возникла странная проблема с использованием адаптера PDO Zend_Db для управления моими подключениями к базе данных. Внезапно я постоянно нажимаю ограничение на соединение на моем сервере MySQL.

По какой-то причине каждые три или четыре часа или около того я получаю эту ошибку, и Apache избавляется от каждого HTTP-запроса с этой ошибкой:

PHP Неустранимая ошибка: исключить исключение «Zend_Db_Adapter_Exception» с сообщением «SQLSTATE [00000] [1129] Хост« my.internal.mysql.server.DNS.here »заблокирован из-за многих ошибок подключения; разблокировать «mysqladmin flush-hosts» в

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

Перезагрузка службы mysql или очистка соединений с помощью mysqladmin flush-hosts делает трюк, и я уверен, что увеличение максимальных одновременных подключений в my.cnf также поможет устранить некоторые из этих проблем, но, похоже, основная проблема связана с само приложение создает слишком много соединений.

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

Solutions Collecting From Web of "Приложение Zend Framework не закрывает соединения mysql правильно"

Я думаю, что один из ваших сценариев работает с очень длинным запросом или застрял?

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

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

Я не знаю объем вашего проекта, но он может иметь некоторые побочные эффекты производительности .

Кроме того, игра с долгой функцией запросов MySQL, вероятно, даст вам некоторый намек.

Надеюсь, вы найдете, где ваша проблема.

Вы пытались вручную закрыть соединение? Это, по-видимому, особая проблема.

$db->closeConnection(); 

Ссылка: http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.closing

15.1.8. Закрытие соединения

Не уверен, что это вам пригодится, но эта ссылка дает вам (временное) хорошее описание проблемы, которую вы испытываете, а также параметр -max_connect_errors, который вы можете переопределить:

http://developer.spikesource.com/wiki/index.php/Question:mysqladmin_host_blocked_because_of_many_connection_errors

Пользователь также отвечает и рекомендует попробовать следующее в командной строке:

 > mysqladmin -u <user> -p<password> processlist 

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

Наше приложение Zend также оставило несколько открытых соединений. Они, как правило, приходят в штыки, но мы никогда не выясняли, что происходит. Мы работали над проблемой, установив max_connections высоко (что нам было необходимо по другим причинам, так или иначе) и сократили wait_timeout до двух часов. Мы могли бы уйти с гораздо меньшим таймаутом, но не хотели рисковать реальным приложением, как только перестали видеть сбои.

сначала я спрошу: есть ли у вас новые ядра? (проверьте журнал ошибок apache).

во-вторых: из моего мрачного опыта, имеющего слишком много соединений с базой данных, обычно это означает, что у вас слишком много процессов apache, которые не умирают должным образом. Обычно это вызвано каким-то долговременным процессом, блокировкой памяти и т. Д., Чтобы попытаться strace некоторые из ваших процессов apache и посмотреть, не повесились ли они или не сделали бесконечных циклов.

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

Не думайте, что это связано с правильным закрытием соединения. http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html говорит, что это скорее проблема с сетевым уровнем.

  • Если БД находится на другом компьютере, проверьте проблемы сетевого соединения между (кабелями, коммутаторами, брандмауэрами)
  • Если БД находится на одном компьютере, попробуйте подключиться с помощью сокета, а не TCP.