PHP mySQL - Ne zaman veritabanı bağlantısını kesmek için en iyi zaman nedir?

6 Cevap php

I lazy connection Benim DB nesnesi içinde benim DB bağlanmak için kullanın. Bu temelde ilk sorgu kendisine teslim edilinceye kadar o () mysql_connect aramıyor, ve sonra ve daha sonra gelen reconnecting atlıyor demektir.

Şimdi disconnectFromDB() hoş çok çağrılar mysql_close() ve setleri $_connected = FALSE (yani query() yöntemi bilecek adlandırılan benim DB sınıfının bir yöntemi var ) yine DB bağlanmak için. Ben (kod sadece bir örnektir) gibi bir şey düşünüyordum çünkü bu ... nesnesi aracılığıyla harici her türlü (özel bir fonksiyonu olarak) sorgu veya sonrasında aranmalıdır

$students = $db->query('SELECT id FROM students');

$teachers = $db->query('SELECT id FROM teachers');

Her sorgudan sonra kapanış ise sadece sonuna kadar bu satırı ekleyerek, bana karşı gibi Şimdi, bu çok bunu yavaşlatmak istiyorum

$db->disconnectFromDB();

Veya sadece sayfanın en sonunda yukarıda ki satırı içermelidir?

Ne avantajları / dezavantajları var mı ya? Ne sizin durumunuzda en iyi çalıştı? Performans küçük kaybının yanı sıra, mySQL bağlantısını kapatmak için unutmak gerçekten yanlış bir şey var mı?

Cevaplamak için zaman ayırdığınız için teşekkür ederiz.

Teşekkür ederiz!

6 Cevap

Kalıcı bağlantılarını kullanarak sürece bildiğim kadarıyla, MySQL bağlantı sayfası yürütme sonunda kapalı olacaktır.

Bu nedenle, kesmek arayarak hiçbir şey katacak ve tembel bağlantısını çünkü siz veya başka bir geliştirici yanlış zamanda bir hata ve keser yaparsa, ikinci bir bağlantı oluşturulacak neden olabilir.

Göz önüne alındığında, ben sadece benim bağlantısı benim için otomatik olarak kapatmak için izin verecek. Sayfalarınız nedenle zaman bu miktar herhangi bir sorun neden olmamalıdır için bağlantıyı tutarak, hızlı yürütülmesi gerekmektedir.

Ben sadece kalıcı bağlantıyı ilgili PHP web sitesinde bu yorum okumak ve bilmek ilginç olabilir:

Here's a recap of important reasons NOT to use persistent connections:

  • When you lock a table, normally it is unlocked when the connection closes, but since persistent connections do not close, any tables you accidentally leave locked will remain locked, and the only way to unlock them is to wait for the connection to timeout or kill the process. The same locking problem occurs with transactions. (See comments below on 23-Apr-2002 & 12-Jul-2003)

  • Normally temporary tables are dropped when the connection closes, but since persistent connections do not close, temporary tables aren't so temporary. If you do not explicitly drop temporary tables when you are done, that table will already exist for a new client reusing the same connection. The same problem occurs with setting session variables. (See comments below on 19-Nov-2004 & 07-Aug-2006)

  • If PHP and MySQL are on the same server or local network, the connection time may be negligible, in which case there is no advantage to persistent connections.

  • Apache does not work well with persistent connections. When it receives a request from a new client, instead of using one of the available children which already has a persistent connection open, it tends to spawn a new child, which must then open a new database connection. This causes excess processes which are just sleeping, wasting resources, and causing errors when you reach your maximum connections, plus it defeats any benefit of persistent connections. (See comments below on 03-Feb-2004, and the footnote at http://devzone.zend.com/node/view/id/686#fn1)

(Ben yukarıdaki metin yazdı biri değildi)

Kesmeden rahatsız etmeyin. $_connected aslında kapanış yapmak için $db->disconnectFromDB(); çağrı maliyeti ile birlikte her sorgudan önce kontrol maliyeti sadece onunla bittiğinde PHP bağlantısını kapatmak icar daha pahalı olması sona erecek Her sayfası.

Reasoning:

1: Eğer komut sonuna kadar açık bağlantıyı bırakırsanız:

  • PHP motoru mysql bağlantıları dahili diziye aracılığıyla döngüler
  • PHP motoru her bağlantı için () dahili mysql_close çağırır

2: Eğer bağlantısını kendinizi kapatırsanız:

  • Eğer her sorgu için $_connected değerini kontrol etmek zorunda. Bu PHP) değişken $_connected A) B var olduğunu kontrol etmek olan bir boolean ve C) doğru / yanlış olduğu anlamına gelir.
  • Sen 'kesmek' işlevi aramak zorunda, ve fonksiyon çağrıları PHP daha pahalı operasyonlar vardır. PHP sizin fonksiyonu A) Eğer işlevi için yeterli argümanlar sunmuşlardır ki) B) / özel korumalı ve C değil, var olduğunu kontrol etmek için vardır. Aynı zamanda yeni yerel kapsamında $ bağlantı değişkenin bir kopyasını oluşturmak için vardır.
  • Sonra 'kesmek' işlevi onlar doğru tipi (mysql kaynak) olduğu) size () ve C mysql_close için gerekli tüm argümanlar sağladıklarını)) (mysql_close PHP A) kontrolleri anlamına gelir) (mysql_close çağrı var ve B olacaktır.

Ben burada% 100 doğru olmayabilir ama ben oranlar benim lehine olduğuna inanıyoruz.

Bir kullanarak kalıcı bağlantıları bakmak isteyebilirsiniz. İşte size yardımcı olacak iki bağlantılar

http://us2.php.net/manual/en/features.persistent-connections.php

http://us2.php.net/manual/en/function.mysql-pconnect.php

Yürütmenin temel birimi muhtemelen bütün bir betik. Her şeyden önce kaynak (yani veritabanı) uygulamak isteyen ne, verimli ve etkili, tek bir komut dosyası bütünüdür.

Ancak, PHP, Apache / IIS / ne olursa olsun, kendi hayatları var; ve onlar size script hayatın ötesinde açmak bağlantılarını kullanarak yeteneğine sahiptir. Yani kalıcı (veya havuza) bağlantıları Signficance bulunuyor.

Betiğinize yedekleyin. Bu, onun yürütülmesi sırasında bu bağlantıyı kullanarak konusunda yaratıcı olmak için bir fırsat hayli çıkıyor.

Tipik naif komut verilen nesneleri / modules / seçilmiş seçenekleri ile ilişkili verilerin yerel olarak uygun hurda toplayıp, tekrar ve tekrar bağlantı vurmak eğiliminde olacaktır. Usul metodoloji, açılış isteyen, alan ve kapanış ile bu bağlantıda bir ceza vermek yerdir. (Açıkça kapalı, ya da script sona kadar tek bir sorgu hayatta kalacağını unutmayın bir bağlantısı ve bir sorgu tüm aynı şey olmadığını dikkat dikkatli olun sorgular tabloları kravat;.. Bağlantıları bağlayacağım ... bağlantıları Böylece hem kullanımında doğru ekonominin bilinçli olmalıdır. (çoğu durumda yuva eşleştirilir).

Sorgu ile ilgili en ekonomik stratejisi mümkün olduğu kadar az olmasıdır. Ben genellikle oldukça küçük parçalar halinde istekleri parsellere daha verilerin tam bir set geri getiren daha fazla veya daha az karmaşık katıldı sorgu oluşturmak için çalışacağım.

Bazı komut infazlar için hiç veritabanı bağlantısına gerek olmayabilir çünkü tembel bağlantısı kullanarak, muhtemelen iyi bir fikir olduğunu.

Öte yandan, açık bir zamanlar açık bırakın ve komut biter gibi açıkça kapatın, veya PHP bağlantısını temizlemek için izin ya da - bir açık bağlantı şey zarar gitmiyor olması, ve istemiyorum Eğer veritabanını ikinci kez sorgulama eğer bir bağlantı denetimi ve yeniden kurulması gereksiz yükü uğramak.