Seyrek değiştirmek sorguları önbelleğe sonuçları için en iyi tekniktir

4 Cevap php

Ben bazı veriler haftalık bazda değişir ama çok sık sık okunan bir php web uygulaması var.

Html çıkışı için veri ve php kodu almak SQL sorguları oldukça karmaşıktır. Orada birden fazla tablo katıldı ve çok sayıda hesaplamalar - ama onlar oldukça temel bir html tablo sonuçlanır. Kullanıcılar gruplandırılmış ve tablo her grup için her hafta ile aynıdır, ancak farklı gruplar için farklı olabilir. Ben potansiyel binlerce kullanıcı için tabloları yüzlerce olabilir.

Performans nedenleriyle, ben bu verileri önbelleğe istiyorum. Aksine bu sorgu ve hesaplamalar birisi sayfasını vurur her zaman çalışan daha, ben gerektiğinde bana basit bir okuma vererek, her bir grup için tablo oluşturmak için bir haftalık süreci çalıştırmak istiyorum.

Ben böyle bir şey başarmak için başarılı ya da başarısız olarak kullandım hangi teknikleri bilmek ilgi duyarım?

Ben görebiliyorum seçenekleri şunlardır:

  • MySQL tablodaki hesaplamaların html sonucu depolamak, kullanıcı grubu tarafından belirlenen
  • (Veri öğeleri hiçbir sabit numara var gibi zor) kullanıcı grubu tarafından belirlenen bir MySQL tablo çıkan verileri depolamak
  • Statik dosyaları sayfa çıktıyı önbelleğe

Başka bir öneri hoş olurdu!

4 Cevap

Birkaç seçenek gerçekten vardır:

  • Bir haftalık bazda sayfaları PreRender ve ardından "statik" onlara hizmet.
  • Bir hafta için bir ilk şans olarak bu yanıtları önbelleğe bir önbellek (örneğin Squid) kullanın. Belirli bir sayfa (örneğin very_long.php? ...) Gidin istekleri web sitesinin geri kalanından ayrı olarak önbelleğe böylece Örneğin, önbelleğe alma ilkesini yapılandırabilirsiniz.
  • DB önbelleğe açmak emin olun. MySQL kendi önbelleğe sahip ve tekrarlanan uzun sorguları değil yeniden böylece ayar bunu ince olabilir.

Tablo oluşturmak için fonksiyonu, bu diskteki bir dosyaya sonucu depolamak olun:

/cache/groups/1.txt
/cache/groups/2.txt

Mutlaka önbellek tarihi (ya da olmayan) dışında olup olmadığını denetlemek, verileri almak için işlevini çağırırken, bunun için bir haftalık toplu iş çalıştırmak zorunda değilsiniz. Eğer öyleyse, üretmek ve daha sonra sonuçlarını önbelleğe. Aksi takdirde, sadece önbelleğe alınmış dosya dönmek.

function getGroupTable($groupId) {
    if (cacheIsStale($groupId)) {
        generateCache($groupId);
    }
    return file_get_contents($cacheFile);
}

cacheIsStale() function sadece tazelik için test etmek için file's timestamps bakmak olabilir.

her şeyden önce, profil. bu sorgular gerçekten zaman önemli miktarda tüketen doğrulayın. belki MySQL sorgu sonuç önbelleklerini zaten sizin için bir çalışma yaptı.

onlar gerçekten kaynaklarını tüketen eğer, ben ne yapacağını hesaplanan sonuçlar ile bir tablo oluşturmak için, ve tüm veri değiştiğinde çağrılacak, yönetmek gerekli mi bir işlemdir. hala geçerli olup olmadığını kontrol etmek için rahatsız etmeden, önceden hesaplanan verilere yalnızca gitmeli bu sık okur.

sadece temel verileri değiştirmek prosedürlere bazı kanca eklemek veya bu (haftalık?) unfrequently idam olurdu eğer veritabanı tetikler ve herhangi bir sonuç üretmek için çok zaman alabilir.

Bu zaten bunun çoğu örtülü var gibi görünüyor.

Bu muhtemelen daha hızlı çözüm olacağını, bunun uygulanabilir bir seçenek olmadığını görmek için bellek gereksinimlerini kontrol etmek gerekir rağmen - Bir diğer seçenek, tablo veri çok büyük değil varsayarak, memcache sonuçlarını önbelleğe için kullanmaktır .