kapalı almıyorsanız MySQL bağlantıları açan PHP kodu nasıl belirleneceği

6 Cevap php

Biz bir raf PHP uygulamaları (hayyam ve XCart) kapalı çift yanı sıra kendi özel kod oluşan bir uygulama var.

Ben bu yüzden tespit edildi tam olarak nasıl bilmiyorum, ama çok MySQL bağlantıları bizim dev üzerinde önemli derecede bellek sızıntısını görmeye olmuştur çünkü ben şaşırmadım (kapanmamış bırakılıyor duymak için sürpriz değilim yok gerçek analizini yapmadım ilk önyükleme üzerine 100MB başlayarak bir veya iki gün, boyunca, koç tüm konser tüketilen alır, ve bunun çok az sunucu) önbelleğe alınır.

Peki, biz suçlu olduğunu tam olarak hangi PHP kodu belirleme hakkında nasıl gidiyor? Ben Xdebug ile önceden deneyim var, ve sürmüşlerdir biz dev üzerinde XDebug güçlendirme ve bazı analizler yapmak için kullanabilirsiniz, bizim ayrı, evreleme çevre makul istikrarlı kazanılmış ettik, o. Bu makul ve / veya başkası daha özel ve / veya ek bir öneriniz var mı?

6 Cevap

Sen kullanabilirsiniz

 SHOW PROCESSLIST

SQL komutu çalıştıran hangi süreçleri görmek için. Yani her bir işlem tarafından kullanılmakta olduğu vb size adınızı, konak, veritabanı anlatacağım. Yani erişilen veritabanlarının bir dizi var, özellikle size ne oluyor biraz fikir vermelidir.

Daha burada: http://codeinthehole.com/archives/2-Monitoring-MySQL-processes.html

Mysql bağlantıları otomatik olarak kapalı olması gerekiyordu, çünkü bu bir php kod neden olmamalıdır.

cf: http://www.php.net/manual/function.mysql-connect.php:

The link to the server will be closed as soon as the execution of the script ends, unless it's closed earlier by explicitly calling mysql_close().

Bazı öneriler:

  • Lütfen developper teknik üretim mysql sunucuya doğrudan erişimi olan nedir? evet ise, o zaman muhtemelen sadece açık onların MySQL Yöneticisi terk :)
  • bazı günlük toplu işlem var mı? evet eğer, belki bellek bazı zombi süreç olduğunu

Sayfa bittiğinde PHP otomatik olarak herhangi bir MySQL bağlantıları kapatır. Bir PHP web uygulaması çok kapanmamış mysql bağlantısı olurdu tek nedeni ya 1) bağlantı havuzu kullanıyorsanız, ya da 2) mysql sunucu veya konnektörü bir hata var.

ama sen gerçekten görmek http://xdebug.org/docs/profiler, bu bağlantı nerede bulmak için koduna bakmak isterseniz

Diğerleri de söylediğim gibi, PHP mysql_connect ile oluşturulan MySQL bağlantıları veya msqli / PDO eşdeğerleri sonlandırır.

Ancak, mysql_pconnect ile kalıcı bağlantıları oluşturabilirsiniz. Bu, mevcut bağlantıları için açık bakmak ve bu kullanır; o birini bulamazsanız, yeni bir tane açılacak. Eğer bir kerede istekleri bir sürü olsaydı, bu bağlantıların yükler açın ve açık kalmak neden olabilirdi.

Sen bağlantı sayısını azaltmak veya kalıcı bağlantıları için zaman aşımı düşürebilir. Daha fazla bilgi için man page altındaki açıklamalara bakınız.

Ben iplik sayısı için GÖSTER DURUMUNU boynuzsuz bir komut dosyası çalıştırmak için kullanılan ve ben mysql_pconnect kullanarak her zaman ipliklerin yüksek sayıda teşvik olduğunu fark ettim. Benim bağlantı hızı gerçekten düşüyor zaman zaman anlayamadı çünkü o çok Kaygılı bulundu. Yani) mysql_connect () denilen bütün yerleri merkezde ve mysql_pconnect (ortadan kaldırmak için emin yaptı.

Ben yaptım sonraki şey bağlantı zaman aşımları bakmak ve daha fazlası gibi 30 saniye çünkü onları ayarlayın. Yani benim my.cnf ayarlanır

connect-timeout = 30

bu yüzden aslında bağlantı sayısı düşüyorlar görebiliyordu. Açık ihtiyacınız bağlantı sayısını belirlemek için, çarpı her açılacaktır veritabanı bağlantıları sayısını koşuyoruz kaç apache işçi bağlıdır.

Ben yapmaya başladı başka bir şey SHOW PROCESSLIST veya mytop onları nokta için sorgular için, bir not ekleyerek, ben gibi benim sonuçlarına bir not sütun eklemek istiyorum:

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

Bu bana mytop baktığımda sorgu yayımlayarak göstermek dosya olurdu ve kullanmak gibi MySQL sorgu önbelleği folyo vermedi

/* __FILE__.'.'.__LINE__ */

benim sorgunun başlangıcında olur.

Ben MySQL özellikle aksine, genel bellek sorunu ile ilgili, yapmak ve özellikle bizim kendi özel kod bağlamında şeylerin başka bir çift, bir veya diğer çağrıları ile sarma kodu olurdu herhalde Aşağıdaki PHP yerleşik işlevler:

memory_get_usage

memory_get_peak_usage

Ben ona olduğum sürece ben şu anda bazı özel koddan günlüğü üzerinde çalışıyorum beri Özellikle, bellek kullanımını giriş yapabilirsiniz