PHP kodlarken veritabanı sorgularında kolaylık sağlasın diye SQL cümlemizi alıp sorgu sonucunu döndüren execSQL, execQuery vs gibi fonksiyonlar tanımlayıp kullanırız. Böylece her seferinde sunucu bağlantısı ve veritabanı seçimi ile uğraşmaktan kurtulmuş oluruz. Tabi kurallara uyan tertipli her programcı gibi fonksiyonun sonunda da mysql_close ile açtığımız bağlantıyı sonlandırmayı unutmayız. Aslında bazen unutmalıyız. Peki neden?Benim kullandığım kod şuna benziyor:
function execSQL($sql) {
include(‘config.php’);
$conn = mysql_connect($DB_HOST, $DB_USERNAME, $DB_PASSWORD);
$db_selected = mysql_select_db($DB_DATABASE_NAME, $conn);
$result = mysql_query($sql, $conn);
mysql_close($conn);
return $result;
}
Bunun gibi bir fonksiyonun kullanıldığı ve SQL sorgularının yoğun olarak çalıştırıldığı bir proje üzerinde çalışıyorsanız şöyle bir hata mesajıyla karşılaşmanız fazla uzun sürmez:
User kullanici_adi has already more than ‘max_user_connections’ active connections
Bu mesajda veritananına PHP’nin ‘max_user_connections‘ ayarı ile belirlenenden daha fazla sayıda bağlantı açıldığı belirtiliyor.
Benim örneğimde bazı yoğun sayfalar 100′ün üzerinde farklı sorgu çalıştırdığından kısa süreler içinde veritabanı sunucusuna onbillerce bağlantı açılıp kapatılıyordu. Sorun aslında PHP’nin ve mysql_connect fonksiyonunun yeni bağlantı açma davranışını bilmemekten geçiyor.
PHP‘nin sayfasında da belirtildiği üzere mysql_connect daha önceden aynı argümanlarla (hostname, username) açılmış bir bağlantı varsa yeni bir bağlantı oluşturmayarak mevcut olanı kullanıyor. Ancak siz özellikle mysql_close ile bağlantıyı kapatmışsanız mutlaka sunucuya yeni bir bağlantı kuruyor.
Bağlantıları kapatmamak ilk bakışta iyi bir davranış olarak gözükmese de PHP’de bunun dez avantaj oluşturacağı durumlar pek fazla değil. Burada yazdığına göre bir PHP script’inin çalışması bittiğinde tüm açılmış bağlantılar zaten otomatik olarak kapatılıp yok ediliyor.
Sorgu çalıştırmanın dışında icra süresi uzun olan kodlarınız varsa mysql_close ile kapatmak iyi bir fikir. Ama bunun dışında mysql_close kullanmayı pek önermiyorum.
mysql_close kullanıp kullanmamayı anlık ortalama sayfa isteği ve kodlarda kullandığınız sorgu cümleleri ile max_user_connections arasında kuracağınız bir ilişkiyle belirleyebilirsiniz.
Kaynak: http://www.tankado.com/?118
mysql max_user_connections, php mysql_connect ve mysql_pconnect farkı, php veritabanı hatasını alma
Benzer Konular:
Dikkat edilmesi gereken bir konuymuş.
Bundan sonra bunu dikkate alarak kodlama yaparım :)
Peki bu hatayı asp sitede alıyorsak ne yapmalıyız bu konu hakkında bilgi verirseniz sevinirim.
yarım doktor candan yarım imam dinden edermiş, seninki de o hesap
Öyle saçma bir fonksiyon kullanan var mıdır yaa?
Agresifiz galiba. :)
fonksiyonunuz sebebiyle o hatayı almakta olduğunuzu düşünüyorum. yazdığınız fonksiyon sorgu için ayrı ayrı mysql ile bağlantı kurmakta ve işi bitince bağlantıyı kapatmakta. bunun yerine bağlantınızı işlem yapacağınız dosyaların başında açtırsanız, ve dosya müddetince gerektiğinde sadece mysql_query çalıştırsanız ve dosya sonunda mysql bağlantısını kapatsanız eminim o max_user_connections hatasını almazdınız. Sorunu algoritmanızdaki eksikliğe bulduğumu belirtmek istiyorum.
mysql_connect fonksiyonu yukarıda belirtildiği gibi davranmaz. Zaten açık olan bağlantıları kullanmak için mysql_pconnect fonksiyonundan yararlanırız. mysql_pconnect ile açılan bağlantı script sona erdiğinde kapanmaz, mysql_close ile de kapanmaz. Ayrıca bağlantı aracını toplam MySQL işlemlerini gören bir nesnede __construct fonksiyonunda yazmak ya da bir bağlantı nesnesi oluşturup sorgu araçlarında Extend etmek daha uygun bence. Mevcut bir bağlantı olup olmadığını if-else mantıksal denetlemesi içinde ( ! $baglanti ) şeklinde düşünüp eğer bağlantı yoksa yenisini açtırmak da iyi bir çözüm olabilir.
Ya sonra da php kasiyor felan diyolar. php kasmiyor kardeshim. siz kasiyorsunuz. her sql sorgusunda dosya include edilermi? her sorguda mysql_connect olur mu? Sorun belirtiginiz gibi mysql_connect davranishini bilmemekden degil de manyak bi sey etmish gibi kasila kasila dokuman yazmak. Bi de utanmadan kaynak gostermek. Cem Yilmaz burada der ki: kaynak kicim. Seninki de o bicim olmush.
Ben bugüne kadar hiçbir php projemde mysql_close() foksiyonunu kapatmadım. Bir güvenlik açığı teşkil eder mi bilmem ama benim açımdan hiçbir sorun olmadı bugüne kadar.