Yüksek verimli PHP / MySQL programları oluştururken takip başparmak kuralları nelerdir?

2 Cevap php

Birkaç dakika önce, ben bir günlüğüne bir seferde çok sayıda sorguları gerçekleştirmek ve oturumları verileri kaydetmek, ya da gerektiği gibi sorgulamak için daha iyi olup olmadığını sordu. Ben (gerektiği gibi sorgulamak için), cevap şaşırdı. Performansını hızlandırmak PHP / MySQL çok kullanıcılı uygulamalar oluştururken takip başparmak diğer iyi kurallar var mı?

Ben mümkün olan en verimli uygulama oluşturmak için özel yollar arıyorum.

2 Cevap

hashing

Lütfen sağlamalarının biliyorum (diziler / tablolar / Aramadan haritaları / ne emretti). bir karma arama çok hızlı olduğunu ve O (n ^ 2) döngüler varsa, bazen, ilk (birincil anahtar ile anahtarlı) bir diziye onları organize ve daha sonra bunları işleyerek O (n) onları azaltabilir.

Bir örnek:

foreach ($results as $result)
  if (in_array($result->id, $other_results)
     $found++;

bir yavaş - in_array O sonuçlanan $other_result tamamının aracılığıyla döngüsü (n ^ 2).

foreach ($other_results as $other_result)
  $hash[$other_result->id] = true;

foreach ($results as $result)
  if (isset($hash[$result->id]))
    $found++;

isset () (neredeyse) sabit bir zaman olduğu için, - ikinci bir çok daha hızlı (daha büyük, daha hızlı sonuç kümeleri bağlı) olduğunu. Eğer php fonksiyonları yerleşik kullanarak daha hızlı bu yapabileceğini, ama fikir olsun - aslında, bu çok iyi bir örnek değildir.

optimizing (My)SQL

  • mysql.conf: ben sizin mysql yapılandırma optimize yerine varsayılan bırakarak kazanmak ne kadar performans herhangi bir fikrim yok. ama varsayılan yapılandırmayı kullanılan her postgresql kriter sayabilirsiniz okudum. afaik yapılandırma ile daha az mysql ile önemli, ama neden bunu görmezden? başparmak kuralı: belleğe tüm veritabanını uygun çalışın :)

  • explain [query]: bariz bir, bir sürü insan yanlış olsun. endekslerin hakkında bilgi. Eğer takip edebilirsiniz kuralları kriter bunu yapabilirsiniz ve size büyük bir fark yaratabilir vardır. Eğer gerçekten her şeyi istiyorsanız, farklı endeksleri türleri (btrees, karma, ...) ve bunları kullanmayı öğrenirler.

caching

önbelleğe alma zor, ama doğru yapılırsa eğer the fark (değil a fark yapar). Bence: Eğer önbelleğe alma olmadan yaşamak, bunu yapmayın. genellikle karmaşıklığı ve başarısızlıkları çok puan ekler. google (intertubes daha hızlı yapmak için) bir kez vekil önbelleğe biraz yaptım ve bazı insanlar başkalarının özel bilgileri gördüm.

php, insanlar düzenli kullanımını önbelleğe 4 farklı türü vardır:

  • query caching: hemen hemen her zaman (bazen paylaşılan bellek APC için) memcached çevirir. hızlı bir anahtar / değer (= karma) depolama motoru belirli bir sorgunun sonuç kümesini saklamak. sorguları (şimdi aramalarını) olmak very ucuz.

  • output caching: (yerine bunu her zaman yenileyici) daha sonra kullanmak için oluşturulan html saklayın. Bu büyük hız-up sonucu, ama biraz PHPs dinamik bir doğaya karşı çalışır olabilir.

  • browser caching: ne ETAG'ları ve http yanıtları hakkında? yapılırsa sağa işin en önlemek olabilir right at the beginning! bunlar HTTP nedir hiçbir fikrim yok çünkü çoğu php programcıları bu seçeneği görmezden.

  • opcode caching: APC, zend optimizer ve böylece. php kod yük daha hızlı yapar. Büyük uygulamaları ile yardımcı olabilir. gerçi (yavaş) dış DataSource'ları ile ilgisi var, ve potansiyel biraz sınırlı.

bazen örneğin, önbelleklerini olmadan yaşamak mümkün değil Bu küçük gelirse. resim boyutlandırma çok pahalı, ama (çoğu zaman) kontrol etmek için fortunatley kolaydır.

profiler

xdebug size uygulama darboğazları gösterir. app çok yavaş ise, neden bilmek yararlı olur.

queries in loops

Orada do not know what a join is (php-) uzman (ve eğitmek her biri için, bu bilgiler olmadan iki yeni olanlar yüzey olacak - ve onlar, çerçeveler yazmak schnalles yasa göreceksiniz). Bazen, bu sorgular-in-döngüler bu açık değildir, örneğin onlar kütüphaneleri ile gelmek durumunda. sorguları saymak - onlar gösterilen sonuçları ile büyürse, yanlış bir şey var.

deneyimsiz geliştiriciler çerçeveler ve içerik yönetim sistemleri yazmak için bir ilkel, doyumsuz dürtü var

schnalle's law

Bunu kolları PHP ardından, MySQL sorguları first Optimize ve son olarak büyük sorgular ve arama sonuçlarını önbelleğe. MySQL, şimdiye kadar, bir uygulamada en sık tıkanıklık olduğunu. Bir kötü tasarlanmış sorgu sadece gerekli bilgileri seçer, iyi tasarlanmış bir sorgu daha 2-3 kat daha uzun sürebilir.

Lütfen sorguları before bunları önbelleğe optimize edilmiştir, bu nedenle, size işlem zaman iyi bir anlaşma kaydettiniz.

Ancak, bazı paylaşılan hosts önbelleğe dosya sistemi Memcached eksikliği sayesinde. Sabit disk arama süresine (ve bağlı diğer sitelere erişim için bekleyen) sitenizin yük altında olduğunda kolayca sorgu daha uzun sürebilir bu durumda o, bunları önbelleğe için daha küçük sorguları çalıştırmak için daha iyi olabilir.