PHP ile mysql bağlantıları şişe boyun

6 Cevap php

Şu anda biz, MySQL bağlantı kurmak için gidiş-dönüş zaman kazanmak amacıyla bir $ _SESSION MySQL bağlantıları geri yükleme

ancak sorun, bağlantı sayısı hızla sınırını aşan olduğunu

böylece çocuklar 'çözüm ne?

Eğer yeni bir bağlantı her zaman yaratmak, ve kullandıktan sonra bu bağlantıyı kapatmak, ya da benim gibi, geri musunuz?

6 Cevap

Dahası DGM 'ın yorumuna, (MySQL bağlantı referans gibi) resource tipleri oturumu ile restore edilmez. Içeriği $_SESSION serialize() kullanarak seri ve oturumu yeniden başlatıldığında restore edilecek oturum kimliği ile saklanır.

Için belgeler serialize şöyle:

string serialize( mixed $value )

value - değer Serileştirilecek. serialize() resource girmeniz dışında, her türlü işler.

Bu aslında her isteği ile yeniden konum anlamına gelir. Tarafından önerilen mysql_pconnect() kullanılarak noselasd muhtemelen bu hafifletmek istiyorum. its manual page üzerine notlar, bu bir modül olarak çalıştırmak için PHP gerektirir özellikle gerçeği kulak emin olun.

Bir oturumda bir bağlantı saklanması sadece çalışmak olmamalıdır. Bunu yapmayın. Aslında yeniden eğer sürpriz olacağını daha sonraki ziyaretlerinizde bağlantı, o ağlar erişimi içerir ve bir dosyada bir ağ bağlantısı saklayamazsınız çünkü! En iyi ihtimalle, bu size bir şey elde etmez sonraki sayfa görünümü, üzerine yeniden bağlanır. En kötü ihtimalle, açık tutulan ve düzgün kapatılmamış olur, her istek için ayrı bir bağlantı var.

edit - some more thoughts

Ayrıca, optimizasyon adına, neden bile rahatsız? Aslında kodunuzu profilli ve bu gerçek bir darboğaz olarak bulduk? Sadece en basit ve net bir şekilde kod yazmak ve sonra ölçülür olmuştur gerçek bir sorun keşfetmek zaman optimizasyonu hakkında endişe. Bir very büyük bir siteniz yoksa, veritabanı bağlantıları herhangi darboğazları kaynağı değildir.

Her yeni sayfa çağrı üzerine ben kurulum yeni bir bağlantı. Ben sayfa boyunca 1 bağlantısını kullanabilirsiniz yapmak ve sayfa tarayıcıya gönderilen zaman kapatın.

Ben çok erken optimize ve kendinizi gereksiz ağrı neden konum şüpheleniyoruz.

PHP gerçekten bağlantı havuzu, diğer diller / çerçeveler çok yaygın bir kavram alanında yoksun.

Sen mysql_pconnect kullanarak oldukça uzak alabilirsiniz. Bir oturumda bir bağlantı saklanması gerçekten kötü bir şey gibi olsa da, çok fazla kaynakları çiğnerler geliyor.

Bir veritabanı bağlantı nesnesi php dünya (afaik ac yapı ya da nesne) dışında büyülü bir şey, yani bir kaynaktır. Eğer bir kaynak serialize ve oturumuna bir değişken depolama (aynı şey serialize(); yapar) seri hale gelir olamaz.

php diğer istekleri ile hiçbir kaynakları paylaşan, yani bir "paylaşılan bir şey" doğa vardır. 2 kişi, hem kullanıcı, hem A, ya da bir kullanıcı A ve bir kullanıcı B, bilmek hiçbir şekilde arasında olabilir. her isteği kapsüllü ve iki istekleri arasında mantıksal bir bağlantı yapmak için sadece çok sınırlı "geçici çözüm" oturumları olmasıdır. her şey (veritabanları, dosyalar, memcached) dışarıdan yakaladı olmalı, bu yüzden artık php sorun değil.

bu nedenle, istekleri arasındaki paylaşımı veritabanı kaynakları olmak istemedim. her kendi mysql_connect isteyin. ben bu ilk etapta php topluluğu ile popüler temel nedeni yapma mysql olduğunu varsayalım. mysql bağlanır, diğer rdbms daha a lot daha hızlı, iyi bir uyum oldu bu yüzden daha az özellik (hiçbir işlem yok, manzarası, tetik yok, hiçbir şey) vardı çünkü.

mysql_pconnect did bağlantısı (ama farklı bir düzeyde) havuzu, ama ya bir sihirli değnek değildir. bugünlerde yine PDO kullanmalısınız (ve PDO afaik bunu desteklemiyor).

Uygulama yavaş ise, sorunlar başka yalan.

my advice:

  • Yapmanız düşünüyorum ne olursa olsun ... sen bağlantıları paylaşmak, böylece bir göz değil. (her sorgu için bağlantı oluşturursa) aslında, uygulama çünkü hile yavaş olabilir. Bu özelliği kaldırmak ve yeniden test edin.
  • sorguları kontrol (EXPLAIN SELECT * FROM foo;)
  • Lütfen endeksleri sağ olsun
  • önbelleğe alma kullanmayın (örn. memcached)

The most common performance problem I see is people who think there's a most-common performance problem that they should be looking for, instead of measuring to find out what their actual performance problem actually is.
- cary millsap

Diğer yanıtlar belirtildiği gibi, php sadece yapılamaz, metinde bir kaynak saklayamazsınız.

Eğer php 5.3 ve mysqli kullanıyorsanız, şimdi "p :/ /" ile bağlarken konak param adýnýnönüne kalıcı bağlantıları kullanabilirsiniz.

mysql uzantısını kullanarak, mysql_pconnect kullanın.

belki http://forge.mysql.com/wiki/MySQL_Proxy, bir mysql bir proxy kurmak olabilir