PHP5 bellek tüketimini ele için Stratejiler?

6 Cevap php

Biz veritabanı kullanılabilseler ile, çok sayıda döngüler dayalı her türlü büyük raporlar üreten bir büyük yönetim yazılımı, böylece yarattıkları (birçok) nesneleri, ve.

PHP4 üzerine bu 64 MB'lık bir bellek sınırı ile mutlu çalıştırabilir - şimdi biz yeni bir sunucu üzerinde ve aynı veritabanı ile taşındı - aynı kod, aynı raporlar bellek sınırı bir konser olmadan gelmeyecek ...

Ben PHP5 başlık altında şeylerin oldukça değiştiğini biliyoruz, ama davranmaya yapmak için bir yolu var mı?

Sonunda soru bir diyet sizin komut olması gerektiğinde ne stratejiler uyguluyorsunuz, nedir?

6 Cevap

Biz haline çalıştırmak büyük bir sorun, onlar kapsamı dışında olunca bellek boşaltarak onları durdurma nesneler arasındaki döngüsel başvurular oldu.

Mimarinizin bağlı olarak __ imha () ve manuel unset referanslar kullanmak mümkün olabilir. Sorunumuzun i sınıfları yeniden yapılandırılması ve dairesel referanslar kaldırarak sona erdi.

Ben herhangi bir senaryo üzerinde kaynaklarını optimize etmek için gerektiğinde, ben analiz etmek her zaman çalışın, profil ve hata ayıklama benim kod, ben xDebug kullanın ve xDebug Profiler, {[gibi diğer seçenekler (vardır 2)]} ve Benchmark Profiler.

Ayrıca ben bu makaleleri tavsiye:

Yeni sunucuya taşıma yana, MySQL ve PHP sistem değişkenleri onlar eski sunucu üzerinde bulunduğumuz yol aynıdır doğruladıktan?

PHP5 yeni işlevsellik bir sürü tanıttı ama nedeniyle geriye dönük uyumluluk mantra, ben PHP5 PHP4 arasındaki farklılıklar, bu büyük bir kod ve veritabanı değişmiş henüz bir uygulama performansı üzerinde etkisi yaratan gerektiğine inanmıyorum.

Ayrıca Apache veya IIS aynı sürümü çalıştırıyor musunuz?

Bu daha büyük olasılıkla yeni sistem çevreye ilişkin PHP4 ila 5 arasında bir yükseltme için daha bir sorun gibi geliyor.

Eğer hata günlüklerini kontrol ettiniz mi? İkiniz de aşağı şeyler yavaşlama ve hafıza usuage ekliyoruz uyarıları bir ton olabilir.

Bertrand

Eğer mevcut kod üstlenmeden istiyorsanız o zaman raporları yürütülürken ilk CPU ve bellek kullanımını izlemesini tavsiye ederim. Eğer SQL server kilitleme mı yoksa (stres bir sürü PHP kodu ile sistem üzerine koymak ediliyor olur ki) Apache kilitledin?

Ben başlangıçta çok ciddi biz tüm rapor oluşturma süreci refactor zorunda MySQL batağa saplanmış bir proje üzerinde çalıştı. Biz bitmiş Ancak, yükü sadece (daha karmaşık PHP kodu aracılığıyla) Apache transfer edildi. Bizim nihai çözüm raporlama fonksiyonları için daha iyi performans sağlamak için ve biz MySQL özgün yapamadık ne boşunu almak için PHP kullanmak için veritabanı tasarımı refactor oldu.

Raporların niteliğine bağlı olarak raporlar için kullanılan verileri denormalizing düşünebilirsiniz. Hatta bir veri ambarı olarak hizmet veren ve OLAP ilkeleri yerine OLTP ilkeleri etrafında tasarlanmış ikinci bir veritabanı oluşturarak düşünebilirsiniz. OLAP ve veri ambarı genel bir açıklama için Wikipedia başlayabilirsiniz.

However, before you start looking at serious refactoring, have you verified that your environments are sufficiently similar by looking at phpinfo(); for PHP and SHOW VARIABLES; in MySQL?

Bir konser!?!

hatta 64MB büyük.

kod bazı yeniden faktoring gerekebilir gibi ortamlarda, (çok tuhaf bir ses geliyor ki) arasındaki farklılığı görmezden geliyor.

Veritabanı sorguları gelen sonuç kümeleri diziler dökülmektedir değildir böylece faktör kodunuzu yeniden herhangi bir şans. Ben size sonuç kümeleri için bir yineleyici inşa öneriyoruz. (Oradan çoğu amaçlar için dizi olarak onları tedavi edebilir). Seferinde bir kayıt taşıma, ve bir seferde 10.000 kayıtları işleme arasında büyük bir fark vardır.

ikincisi, hava kodunuzu verilerin birden çok örneğini yaratıyor bakabilirsiniz. Eğer referans nesneleri iletebilirsiniz. ('Ve' kullanın). Horde çerçevesinde erken bir varyantı kullanırken Biz benzer bir şey yapmak zorunda. 1 MB eki yerine bir referans olarak değil, bir kopya olarak tüm veri kümesini geçti sayısız çağrıları 50MB dışarı darbe olur.