PHP performansı

11 Cevap php

Ne benim sunucularda yazılım kurmadan benim PHP betikleri performans / hızını artırmak için ne yapabilirim?

11 Cevap

Profil. Profil. Profil. Ben bir şey PHP için orada olup olmadığından emin değilim, ama sizin kodu profil bilgilerini eklemek için küçük bir araç yazmak için basit olmalıdır. Sen fonksiyon kez ve SQL sorgu kez profile isteyeceksiniz.

Yani bir işlevi var burada:

function foo($stuff) {
    ...
    return ...;
}

Ben bunu değiştirmek istiyorsunuz:

function foo($stuff) {
    trace_push_fn('foo');
    ...
    trace_pop_fn('foo');
    return ...;
}

(Bu, bir fonksiyon birden fazla döner bir yaralanma haline bu durumlardan biridir.)

Ve SQL:

function bar($stuff) {
    trace_push_fn('bar');

    $query = ...;
    trace_push_sql($query);
    mysql_query($query);
    trace_pop_sql($query);

    trace_pop_fn('bar');
    return ...;
}

Sonunda, program yürütme tam bir izleme oluşturmak ve darboğazları tespit teknikleri her türlü kullanabilirsiniz.

Kolayca raftan çekilebilecek tek makul teknik önbelleğe alma. Zaman büyük bir miktar istekleri (ve hatta müşterileri arasında) arasında ortak olan müşteriler için üreten kaynakların içine gitmek eğilimindedir; Bu çalışma zamanı işi ortadan kaldırmak için dramatik hızlı artışlara yol açabilir. Bu web ağacının dışında bir dosyaya oluşturulan kaynak (veya kaynak fragmanı) dökümü, ve daha sonra gerektiğinde onu geri okuyabilirsiniz. Açıkçası, bazı profil bu aslında rejenerasyon daha hızlı olmasını sağlamak için gerekli olacak - düzenli zararlı olabilir diske geri web sunucusu zorlayarak, bu yüzden kaynak gerçekten çok ağır yeniden olması gerekir yapar.

Ayrıca kadar zaman içinde kötü yazılmış veritabanı sorgularını nasıl harcandığını sürpriz olabilir; zaman ortak sorguları oluşturulur ve bunlar yazılabilir görmek. Zamanın miktarı bazı alt-optimal algoritmaları kullanarak sürece gerçek PHP kodu, genellikle oldukça sınırlı yürütme geçirdi.

PHP "magicy" yaklaşımları / fonksiyonları bazıları bu endişeleri düşünmeye birini aşırı korumak olabilir ama bu hiçbiri, PHP ile sınırlıdır. Örneğin, geçenlerde bir sıralı dizi üzerinde bir ikili arama kullanmak array_search kullanan bir komut dosyası güncellenir ve beklenen üstel hızlanmayı kazandı.

Gerçekten XDebug profilcisini kullanmayı düşünün: belli bir fonksiyon beklerdik ne karşı yürütülmekte olan ne kadar kontrol yardımcı olur.

I try to decrease instructions while improving code readability by replacing logic with array-lookups when appropriate. It's what Jeff Atwood wrote in [The Best Code is No Code At All][1].

  • Also, avoid loops inside another loop, and nested if/else statements.
  • Short functions. Sometimes a lot of code does not need to be executed when the result-value is already known.
  • Gereksiz test:

    if (count ($ dizi) === 0) return;

    : olarak da yazılabilir

    (! $ dizi) return eğer;

    Başka bir işlev çağrı yok!

    [1]: http://www.codinghorror.com/blog/archives/000878.html "İyi Kod At All No Code"

Hiçbir sihirli çözüm olduğunu ve genel çözümler sunmak için çalışırken de sadece zaman kaybı olabilir.

Nerede darboğazları nelerdir? Örneğin sizin komut işlemcisi / veritabanı / bellek yoğun?

Herhangi bir profil gerçekleştirdik?

Aklıma olanlar ...

  • Loop invariants are always a good one to watch.

  • Write ESTRICT and ENOTICE compliant code, particularly if you are logging errors.

  • @ Operatörü kaçının.

  • Absolute paths for requires and includes.

  • Yerine düzenli ifadeler her zaman olası str_replace vb strpos kullanın.

Sonra işe yarayabilecek diğer yöntemlerle bir grup var, ama muhtemelen alışkanlık size çok fayda verir.

dosyaları da dahil olmak üzere yavaş, ve bunları gerektiren bile yavaş. Eğer her sınıf da dahil olmak üzere __ autoload kullanırsanız o kadar ekleyeceğiz. örneğin.

Ben her zaman kod clairty feda varsa, kod optimizasyonu açısından çok zeki olmaya çalışıyorum biraz dikkatli yaşıyorum. Bunu hızlı yapmak için kod karanlık yapmanız gerekiyorsa, bunun yerine kod çimdik çalışırken zaman israf HARDWEAR yükseltmek için daha ucuz olmaz mı? İşlemci döngüleri, tüm sonra, programcı döngüleri daha ucuzdur.

Ben performans sorunlarına bakmak zaman, yapmam gereken en iyi şey, kendi sayfaları çalıştırmak için almak ne kadar uzun zaman olduğunu düşünüyorum, ve sonra yavaş olanlar bakmak. Bu gerçek ölçümleri olsun, genellikle yavaş bir SQL sorgusu sabitleme ya da belki kodunu biraz sıkarak ya büyüklük emir tarafından yavaş olanları performansını artırabilirsiniz.

Bu tabi ki yeni bir donanım ya da yazılım, mevcut kod sadece eleştirel bir göz gerektirir.

O dedi, bu sadece çok uzun ... gerçekten donanım sınırlarını vurmak için yeterli trafik alıyorsanız eğer için çalışacak, ve / veya sadece doğal yavaş ve gerçekten gerekli bazı kod var, bakmak zorunda kalacak diğer olasılıklar.

Ben büyük bir raporlama sistemi için sorumlu değilim ve biz tür olduğu gibi yavaş raporlarını izleyebilirsiniz. Ben ne kadar sürdüğünü belirlemek bitirdiğinde rapor daha sonra başladığında ve ben db içine benzersiz bir anahtar ateş. Ben veritabanı kullanıyorum çünkü sayfalar timeout zaman (ben istiyorum daha çok olur) algılayabilir bu şekilde

İlk profilleme gibi diğer tavsiye bazı ve iyi kaynak tahsisi kararları takip, örneğin önbelleğe alma.

Ayrıca, hesabınıza veritabanı gibi dış kaynakların performansını alır. MySQL örneğin slow query log kontrol edebilirsiniz. Buna ek olarak veritabanı tasarımı bir konuda ihmal etmedi emin olun. Sorularına (again for MySQL) gerçek verilere karşı optimize büyük ödeyebilirsiniz.

Rasmus Lerdorf FrOSCon '08 "Simple is Hard" yaptığı son sunumunda bazı iyi ipuçları verdi. Bir bytekod önbellek kullanıyor (ve gerçekten birini kullanıyor olmalıdır) ise, yol özlüyor çok zarar dahil, bu yüzden senin / require_oncenin gerektirir optimize.

Sen optimize edebilirsiniz sizin kodun hangi parçası görebilmek için xhprof gibi profilleme aracını kullanabilirsiniz!