PHP 4'ten 5'e geçişte bellek sızıntısı - herhangi bir ipucu?

3 Cevap php

I am porting a large web application to a shvardırd web hosting environment. The app was written in PHP 4. The new environment has PHP 5.2.

Nedense, uygulama PHP 5.2 çalışan bellek muazzam miktarda sızıntı yapıyor. (Bir paylaşımlı ortamda, PHP 4, 12 veya 16 MB ile çalıştırmak için kullanılan sitede çok cömert) 64 MB sınırına ulaşana kadar tam anlamıyla, bellek kullanımı memory_get_usage () kullanarak çatı geçiyor izleyebilirsiniz.

Bu PHP 5 değiştirdi şey, argüman olarak nesne başvurularını büyük olasılıkla işleme bir yan etkisi olduğunu sanıyorum. Ancak, belli bir davranışı (ler) bu neden (ler) kaçak için arama (evet, o benim) uygulama çok karmaşık olduğu gibi son derece zor ve kısmen çok iyi yazılmış değildir.

App paylaşılan bir site alanı üzerine kurulu olduğu, ben (bildiğim kadarıyla) klasik hata ayıklama tesisleri kullanamazsınız. Ben çok çok ben bir süre için bütün gün tam anlamıyla proje üzerinde çalışıyorum gibi, yerel çevreyi yeniden önlemek istiyorum.

Yani benim sorular şunlardır:

  • Herkes nesnelerin büyük miktarlarda ile ilgili özellikle, tipik PHP4 => 5 geçiş tuzaklar biliyor mu, benim sızıntı neden (ler) olabilir

  • Biri bana hangi değişkenlerin bellek bu muazzam miktarlarda yiyorsun öğrenmek yardımcı olabilir PHP tarafından kullanılan değişkenler için debugger bağımsız, script-sadece "grafik kapsam dökümü" aracı bir tür biliyor mu?

3 Cevap

Bu sorunu çözmek için, I would:

  1. Xdebug + wincachegrind (veya diğer bazı profiler) ve / veya FirePHP ile komut profile.
  2. Tüm php hata + bildirimlerini almak için KESİN modunu açın.

Bunu yaparken, sizin için mümkün olacaktır:

  • Kodunuzu optimize. (Hata / uyarı / bildirimler kodunuzu hızlandırabilir Çıkarma)
  • Kodunuzu temizleyin. (Uygun php5 nesne sözdizimi kullanarak sadece performans için iyi olabilir).

Nesne modeli tamamen PHP4 den PHP5'ta değişti. Herhalde, KESİN modu "başvuru tarafından geçirilen" açık kullanmanız gerektiğini size söyleyecektir.

Ben 5.2 bir sürümünde bulunan tek ortak bir strtotime memory_get_usage onu yakalamak olmadan sızdırılmış oldu. Strptime sorunu sabit geçme.

5.2.8 için bu bir hata raporu var - http://bugs.php.net/bug.php?id=46889.

Hata ayıklayıcı olmadan size kullanımı birçok hafıza düşünmek bir komut dosyasını açmak ve kritik yerliler memory_get_usage işlevi koydu.