HTML Dizesi veya Nesnesi depolamak için Geçici API kullanmalı mıyım?


18

Varsayalım ki çok karmaşık bir sorgu ile 20 ilgili gönderi (her gönderi için) gösteren bir eklenti var. Ve sonra bu sorgudaki verileri kullanarak, karmaşık HTML düzeni oluşturur. Ayrıca, eklentinin herkese açık olduğunu ve herhangi bir yapılandırmaya sahip herhangi bir sunucuya yüklenebileceğini unutmayın.

Gibi bir şey:

/* complex and large query */
$related_posts = get_posts( ... );

$html_output = '';
foreach($related_posts as $key => $item) {
     /* complex layout rendering logic (but not as slow as the previous query) */   
     $html_output .= ...;
}

Yani sorularım:

  • Bu tür verileri önbelleğe almanın en güvenli ve en doğru yolu nedir?
  • $related_postsDizi veya $html_outputdizeyi önbelleğe almak için Geçici API kullanmalı mıyım ? Dizeyi önbelleğe $html_ouputalırsam, maksimum boyut sınırına ulaşacak mı? Kaydetmeden önce belki gzip etmeliyim?
  • Geçici API'yı burada kullanmalı mıyım?

Yanıtlar:


18

Geçici API'yı burada kullanmalı mıyım?

Hayır.

Bir stokta WordPress kurulum geçici işlemleri wp_options tablosunda saklanır ve yalnızca temel yükseltmeler sırasında temizlenir. Diyelim ki 50.000 yayınınız var, bu seçenekler tablosunda 50.000 ek satır var. Açıkçası autoload = no olarak ayarlandılar, bu yüzden tüm hafızanızı tüketmeyecek, ancak başka bir uyarı var.

Seçenekler tablosundaki otomatik yükleme alanının bir dizini yoktur; yani, çağrının wp_load_alloptions()tam tablo taraması gerçekleştireceği anlamına gelir . Ne kadar çok satırınız varsa, o kadar uzun sürer. Seçenekler tablosuna ne kadar sık ​​yazarsanız, MySQL'in dahili önbellekleri o kadar az verimli olur.

Önbelleğe alınan veriler doğrudan bir gönderiyle ilgiliyse, gönderi metalarında depolamak daha iyidir. Post meta önbellekleri (genellikle) WP_Query'de posta alma sırasında (genellikle) hazırlandığından, bu, önbelleğe alınan içeriği her görüntülemeniz gerektiğinde size bir sorgu da kaydeder.

Meta değere ilişkin veri yapınız değişebilir, bir zaman damgasına sahip olabilir ve önbelleğe alınan değer eskiyse, geçici bir davranış gibi pahalı sorgunuzu gerçekleştirebilirsiniz.

Akılda tutulması gereken bir diğer önemli düşünce, WordPress geçişlerinin kalıcı nesne önbelleğe alma ortamlarında uçucu olabileceğidir. Bu, önbelleğe alınan verilerinizi 24 saat geçici olarak saklarsanız, 23 saat, 12, hatta 5 dakika içinde kullanılabileceğinin kesinlikle garantisi olmadığı anlamına gelir. Birçok yükleme için nesne önbelleği arka ucu, Redis veya Memcached gibi bir bellek içi anahtar / değer deposu ve daha yeni nesnelere sığacak kadar ayrılmış bellek yoksa, eski öğeler çıkarılır. Bu, meta depolama yaklaşımı için büyük bir kazanç.

Geçersiz kılma da daha akıllı olabilir, yani ilgili yayın önbelleklerini neden X saat içinde geçersiz kılıyorsunuz? Bazı içerikler değiştiği için mi? Yeni bir yayın eklendi mi? Yeni bir etiket mi atandı? "Karmaşık ve büyük sorgunuza" bağlı olarak, SADECE sorgunuzun sonuçlarını değiştirecek bir şey olursa geçersiz kılmayı seçebilirsiniz.

$ Related_posts dizisini veya $ html_output dizesini önbelleğe almak için Geçici API kullanmalı mıyım? $ Html_ouput dizesini önbelleğe alırsam, maksimum boyut sınırına ulaşır mı? Kaydetmeden önce belki gzip etmeliyim?

PHP, MySQL, vb. Arasında akacak olan veri olduğundan, dizenizin boyutuna çok bağlıdır. MySQL'in sınırlarına ulaşmak için çok uğraşmanız gerekir, ancak örneğin Memcached varsayılan nesne başına sınır sadece 1 mb.

"Karmaşık düzen oluşturma mantığı" ne kadar sürer? Öğrenmek için bir profil oluşturucudan geçirin. Şansı çok hızlı olması asla bir darboğaz olmayacak.

Bu durumda, posta kimliklerini önbelleğe almanızı öneririm. WP_Post nesneleri değil, çünkü bunlar tam gönderi içeriğini içerecek, ancak sadece bir dizi gönderi kimliği içerecektir. O zaman sadece bir kullanmak WP_Querybir ile post__inbirincil anahtar ile çok hızlı bir MySQL sorguda sonuçlanacaktır.

Bununla birlikte, öğe başına gereken veriler oldukça basitse, belki başlık, küçük resim URL'si ve kalıcı bağlantı ise, o zaman bu üçü, MySQL'e ekstra bir gidiş dönüş yükü olmadan ve çok uzun HTML'yi önbelleğe alma yükü olmadan saklayabilirsiniz Teller.

Vay canına bu çok fazla kelime, umarım yardımcı olur.


12

Tüm WP Kodları Genel Kod Değil

Eğer herkese açık bir şey yayınlayacaksanız, kovshenin söylediği her şey son derece geçerlidir.

Kendiniz veya şirketiniz için özel kod yazacaksanız işler farklıdır.

Harici Nesne Önbelleği Her Durumda Büyük Bir Avantaj

Harici bir kalıcı nesne önbelleği ayarlamak için , mümkün olduğunda çok önerilir .

Kovshenin'nin geçici ve MySQL ile ilgili cevabında söylenen her şey çok doğrudur ve WP'nin kendisinin ve bir dizi eklentinin nesne önbelleğinden yararlandığını düşünürsek ... Redis veya Memcached gibi modern bir önbellek sistemi.

Önbellek Değerleri Olamayabilir: Sorun Yok

Dahası, evet, harici bir nesne önbelleği güvenilir değildir . Geçici bir durum olduğu gerçeğine asla güvenmemelisiniz. Önbellek olması gerektiği yerde değilse, çalıştığından emin olmanız gerekir .

Önbellek depolama değil, önbellek önbellektir.

Önbelleği Seçmeli Kullan

Bu örneğe bakın:

function my_get_some_value($key) {
   // by default no cache when debug and if no external object_cache
   $defUse = ! (defined('WP_DEBUG') && WP_DEBUG) && wp_using_ext_object_cache();
   // make the usage of cache filterable
   $useCache = apply_filters('my_use_cache', $defUse);
   // return cached value if any
   if ($useCache && ($cached = get_transient($key))) {
     return $cached;
   }
   // no cached value, make sure your code works with no cache
   $value = my_get_some_value_in_some_expensive_way();
   // set cache, if allowed
   $useCache and set_transient($key, $value, HOUR_IN_SECONDS);

   return $value;
}

Özel sitenizde böyle bir kod kullanmak , özellikle çok fazla kullanıcınız varsa site performansı çok gelişebilir .

Bunu not et:

  • Varsayılan olarak, hata ayıklama açıkken önbellek kullanılmaz, bu nedenle umarım geliştirme ortamınızda kullanılır. İnan bana, önbellek hata ayıklamayı cehenneme çevirebilir
  • Varsayılan olarak, WP harici bir nesne önbelleği kullanmak üzere ayarlanmadığında da önbellek kullanılmaz. MySQL ile bağlantılı tüm problemlerin mevcut olmadığı anlamına gelir, çünkü MySQL kullandıklarında geçici değildir. Muhtemelen daha kolay bir alternatif, wp_cache_*işlevleri kullanmak olacaktır , bu nedenle harici bir önbellek kurulmamışsa, önbellek bellekte olur ve veritabanı asla dahil olmaz.
  • Karşılaşabileceğiniz bazı uç durumları işlemek için önbellek kullanımı filtrelenebilir

Önbellek Yoksa Web Ölçekli Değil

Önbellekle ilgili hız sorunlarını çözmeye çalışmamalısınız. Hız sorunlarınız varsa, kod yazdığınızı tekrar düşünmelisiniz.

Ancak bir web sitesini web ölçeğinde ölçeklemek için önbellek oldukça gereklidir .

Ve çoğu zaman (ama her zaman değil) fragman, içeriğe duyarlı önbellek, agresif tam sayfa önbelleklemesinden çok daha esnek ve uygundur.

Sorularınız:

Geçici API'yı burada kullanmalı mıyım?

O bağlıdır .

Kodunuz çok fazla kaynak tüketiyor mu? Değilse, belki önbellek gerekmez. Söylendiği gibi, sadece bir hız meselesi değildir. Kodunuz hızlı çalışırsa, ancak birkaç kullanıcı için bir grup CPU ve bellek gerektirirse ... 100 veya 1000 eşzamanlı kullanıcınız olduğunda ne olur?

Önbellek iyi bir fikir olacağını fark ederseniz ..

... ve genel kod: muhtemelen hayır . Yukarıdaki genel kod örneğimde olduğu gibi seçici bir şekilde önbelleğe almayı düşünebilirsiniz, ancak bu tür kararları uygulayıcılara bırakırsanız genellikle daha iyidir.

... ve özel kod: çok büyük olasılıkla evet . Ancak özel kod için bile, seçici önbellekleme, örneğin hata ayıklama için hala iyi bir şeydir.

Her neyse, bu wp_cache_*işlevlerin veritabanını kirletme riski olmadan önbelleğe erişebileceğini unutmayın.

$ Related_posts dizisini veya $ html_output dizesini önbelleğe almak için Geçici API kullanmalı mıyım?

Duruma göre bir çok şey üzerinde. Dize ne kadar büyük? Hangi harici önbelleği kullanıyorsunuz? Yayınları önbelleğe alacaksanız, kimliği dizi olarak saklamak iyi bir fikir olabilir, iyi sayıda gönderiyi kimlikleriyle sorgulamak oldukça hızlıdır.

Son Notlar

Geçici API, muhtemelen WordPress'in en iyi şeylerinden biridir. Her türlü önbellek sistemi için bulabileceğiniz eklentiler sayesinde, başlık altında çalışabilen çok sayıda yazılıma aptal basit bir API olur.

WordPress'in dışında, bir grup farklı önbellekleme sistemi ile kutudan çıkan ve soyutlamadan bir sistemden diğerine geçmenize izin veren böyle bir soyutlama bulmak çok zor.

WordPress'in diğer modern şeylerden daha iyi olduğunu söylemeyi nadiren duyabilirsiniz, ancak geçici API, WordPress ile çalışmadığımda özlediğim birkaç şeyden biri.

Elbette önbellek zordur, kod sorunlarını çözmez ve gümüş bir mermi değildir, ancak çalışan yüksek trafikli bir site oluşturmak için ihtiyacınız olan bir şeydir .

Önbellek yapmak için yeterince optimize edilmemiş bir MySQL tablosu kullanmak için WordPress fikri oldukça çılgınca, ancak WordPress'in varsayılan olarak yaptığı için kendinizi önbellekten uzak tutmak daha iyi değil.

Sadece işlerin nasıl çalıştığını anlamanız ve ardından seçiminizi yapmanız gerekir.


2

Önceki cevaplar zaten tamamen kabul ettiğim zorunlu " Bağımlı. "

Yine de, bu en iyi yukarıda açıkladığınız senaryoda nasıl olacağını " varsayalım " dayalı bir tavsiye eklemek istiyorum .

Ben kullanmak ister Geçişlerine bu durumda, daha ziyade Mesaj Meta , ikincisi olduğunu, çünkü tek avantajı: Kontrol .

Verileri her yayın için ayrı ayrı önbelleğe almanız gerektiğinden, önbelleğe alacağınız veri miktarı yayın sayısına bağlıdır ve zamanla artar. Belirli sayıda gönderiyi aştığınızda, nesne önbelleğinizin kullanmasına izin verilen bellek sınırlarına ulaşabilir ve daha önce önbelleğe alınmış verileri süresinin dolmasından önce bellekten silmeye başlayacaktır. Bu, her ziyaretçinin her sayfa isteği üzerine "aşırı karmaşık SQL" i tetikleyeceği ve sitenizin tamamen batacağı bir ziyaretçi akışının olduğu bir duruma yol açabilir.

Post Meta'nızdaki verileri önbelleğe alırsanız, yalnızca nasıl depolandığını ve alındığını kontrol etmekle kalmaz, aynı zamanda nasıl güncelleneceğini de tam olarak kontrol edebilirsiniz. Bunun için, yalnızca siteye trafik gelmediği veya hiç trafiğin olmadığı zaman aralıklarında çalışan bir cron işi eklersiniz. Bu nedenle, "yavaş sorgu" sitenin gerçek kullanıcıları tarafından hiçbir zaman karşılaşılmaz ve hatta ilk yüklüyse, iş zaten önceden yüklenir.

Tüm önbelleğe almanın bir değiş tokuş olduğunu unutmayın! Bu yüzden olağan cevap "Bağlıdır." ve neden "kutsal önbellek" yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.