Zend Framework uygulama düzgün mysql bağlantıları değil kapanış

5 Cevap php

Benim veritabanı bağlantılarını yönetmek için Zend_Db PDO adaptörü kullanarak garip bir sorun yaşıyorum. Aniden, sürekli benim MySQL sunucusundaki bağlantı sınırına isabet değilim.

Sebebi ne olursa olsun, her üç ya da dört saat ya da bu yüzden bu hatayı alıyorum sonuna kadar ve Apache bu hata her HTTP isteği üzerine saçmalıkları:

PHP Ölümcül hata: iletisinde 'sqlstate [00000] [1129] Ana' my.internal.mysql.server.DNS.here 'ile yakalanmamış istisna' Zend_Db_Adapter_Exception 'çünkü birçok bağlantı hataları engellenir; içinde 'Mysqladmin gömme-hosts'' ile engelini kaldırmak

Tuhaf şey, ben herhangi bir kod değişmedi ve trafik hacimleri aşağı onlar geçmişte oldum ne aslında,, bu yüzden benim app shouldn't daha fazla eşzamanlı bağlantı getirici biliyorum. Tuhaf şey ben yaklaşık bir hafta içinde ana uygulama dosyaları herhangi bir kod değişmedi ve herşey tıkırında yana koştu gelmiştir.

Mysql servisini yeniden veya Mysqladmin gömme ana bağlantıları yıkama işi yapar, ve ben my.cnf maksimum eşzamanlı bağlantıların artırılması eminim ayrıca bu konularda bazı hafifletmeye yardımcı olacaktır, ama bir temel sorun var gibi görünüyor çok sayıda bağlantı oluşturarak uygulamanın kendisi.

Herhangi Ben detaya ve asılı bağlantı neden kod parçası ilişkili olabilir nasıl düşünce? Dışarıdan, web uygulaması yük cezasının farklı tüm sayfaları ve iyi bir hız ile.

5 Cevap

Ben komut biridir ultra uzun sorguyu çalıştıran veya takılıyorum olduğunu düşünüyorum?

En iyi çözüm, bir günlük bir araç oluşturmak ve sorunun nerede olduğunu tam olarak bilmek için kullanmak olacaktır.

Zend_Log sınıfları bunu günlük aracı yazmak için yardımcı olacaktır, tabii ki kullanıcı bir dosya yazar ve DB biri değil iyi olması. Sorunun DB ilgili olduğundan bazı günlükleri yayarlar DB sınıf oluşturmak veya değiştirmek gerekir.

Ben projenin hacimsel bilmiyorum ama bazı performance side effects olabilir.

Ayrıca MySQL long query özelliği ile oynarken muhtemelen bazı ipucu verecek.

Eğer sorun nerede bulacağız umuyoruz.

Elle bağlantıyı kapatmak için denemek mi? Bu, belirli bir sorun gibi görünüyor.

$db->closeConnection();

Ref: http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.closing

15.1.8. Bağlantı Kapanış

Emin değil bu size herhangi bir faydası yoktur ama bu bağlantı size karşılaştığınız sorunu yanı sıra geçersiz olabilecek bir --max_connect_errors ayarı (geçici) iyi bir açıklamasını verir eğer:

http://developer.spikesource.com/wiki/index.php/Question%3Amysqladmin%5Fhost%5Fblocked%5Fbecause%5Fof%5Fmany%5Fconnection%5Ferrors

Bir kullanıcı da yanıt verir ve komut satırında aşağıdaki çalışıyor tavsiye:

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

Bu, şu anda çalışan kaç eşzamanlı bağlantı için bir fikir almak için size mevcut mysql bağlantılarının bir listesini verecektir. Yine, bu demek başına çözüm değil, ama umarım onlar bir adım daha düştü bağlantı sorununu çözmek için alırsın.

Bizim Zend uygulaması da açık epeyce bağlantılarını bırakarak olmuştur. Onlar hamlelerle gelmek eğilimindedir, ama biz ne olup bittiğini anlamaya yapmadım. Biz iki saat max_connections yüksek (biz zaten, başka nedenlerle için gerekli olan) ve azaltılması wait_timeout ayarlayarak sorunu çalıştı. Biz çok daha düşük bir zaman aşımı ile kaçabilirmiş, ama biz hataları görerek durdu kez gerçek bir uygulama riske istemiyordu.

İlk sorarım: Eğer herhangi bir yeni çekirdek-dökümleri var mı? (Apache hata günlüğünü kontrol edin).

saniye: veritabanına çok fazla bağlantıları olan, benim gaddar deneyimlerinden genellikle çok apache süreçleri düzgün ölüyor değil demektir. Genellikle bu gibi bazı uzun soluklu süreç, bellek kilitler, apache süreçlerin strace, bazı çalışın ve onlar sonsuz döngüler somewere asmak ya da yapmak görmek neden olur.

Trafikte önemli bir artış olmadığı sürece çok-çok-bağlantı sorunları muzdarip olmamalı