Her yerde nesne önbelleği
WordPress, veritabanı sorgularının sayısını mümkün olduğunca azaltmaya çalışır.
Örneğin, herhangi bir zamanda bir meta alan veya taksonomi alanını aldığınızda, veritabanını sorgulamadan önce, WordPress bunun önceden sorgulanmış ve önbellekte saklanmış olup olmadığını bakar ve veritabanını sorgulamak yerine oradan döndürür.
"Önbellek işi" WP_Object_Cache
sınıf ve wp_cache_*
işlevlerle (bu sınıf yöntemlerine sarıcı olan) yapılır.
Önbellek nerede yaşıyor
Varsayılan olarak, "önbellek" bir PHP global değişkeninden başka bir şey değildir. Hafızada olduğu anlamına gelir, ama aynı zamanda her istek üzerine ortadan kaybolur demektir.
Bununla birlikte, damlalar ( advanced-cache.php
ve / veya object-cache.php
) aracılığıyla, bu önbelleği işlemek için özel bir yol ayarlamak mümkündür.
Genellikle, bu damlacıklar tekil istekleri "hayatta kaldıran" bir tür önbellekleme mekanizması kurmak için kullanılır.
Bu nedenle, WP insanlar arasında, bunlar "kalıcı önbellek" eklentileri olarak bilinir (kabarcık dışında "önbellek" ve "kalıcı" ifadeleri birlikte pek bir anlam ifade etmiyorlar).
Günümüzde popüler seçenekler Memcached veya Redis .
Bu nedenle, "kalıcı önbellek" eklentilerini kullanarak, önbellek her istekde güncellenmediği için veritabanı sorgularının sayısını büyük ölçüde azaltabilirsiniz.
Bazı örnekler
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
Yukarıdaki 2 kod satırı, en fazla 1 veritabanı sorgusunu tetikler.
Aslında, özel bir alanı sorguladığınızda, söz konusu gönderinin tüm alanları veritabanından alınır, nesne önbelleği üzerinden önbelleğe alınır ve ardından gelen istekler, verileri önbellekten alır ve db'den değil.
Aynı durum taksonomi terimleri için de geçerliyse, WordPress bir taksonomi için tüm terimleri bir kez çeker, ardından önbellekten döndürür.
Nesne önbelleği, WordPress'te çok yaygın olarak kullanılır. Sadece gönderiler, meta değerler ve taksonomiler için değil, aynı zamanda kullanıcılar, yorumlar, tema verileri için de ...
Tüm bunlarla ne WP_Query
ilgisi var?
Bazı gönderileri WP_Query
varsayılan olarak WordPress aracılığıyla sorguladığınızda, bunları yalnızca veritabanından (veya önbelleğe alınmışsa önbellekten) çekmez, ayrıca tüm özel alanlar ve çekilen gönderilerle ilgili tüm taksonomiler için önbelleği de günceller .
Aradığınızda Yani, örneğin, get_the_terms()
ya da get_post_meta()
döngü mesajlar aracılığıyla alırken WP_Query
, aslında herhangi bir veritabanı sorgu tetiklemez ama önbellekten çekme bilgileri.
Güzel değil mi?
Evet, ama bir bedeli var.
Önbellek güncelleme, WordPress’in çekimleri yayınlarken meta ve taksonomiler için WP_Query
gerçekleştiği zaman yaptığı “sihir” .update_meta_cache
update_object_term_cache
Bu işlevlerin kaynak koduna bakarsanız, WordPress'in her işlevde yalnızca bir db sorgusu gerçekleştirdiğini, ancak çok fazla işlem yaptığını göreceksiniz. Örneğin, update_object_term_cache
orada 7 iç içeforeach
... Eğer taksonomilerin bir sürü varsa ve sayfa başına mesajların sayısı bu çok ölçülebilir değil, yüksek.
WP_Query
Sonunda bu argümanlar hakkında
Ne 'update_post_meta_cache'
ve 'update_post_term_cache'
ayarlandığında yapmak false
sırasıyla özel alanlar ve sınıflandırmalar için güncelleme önbelleğe WordPress engellemektir.
Bu durumda, ilk kez bir özel alan veya taksonomi sorgulandığında, bir veritabanı sorgusu tetiklenir ve veriler önbelleğe alınır.
Belaya değer mi?
Her zamanki gibi, cevap buna bağlı . Bu değerleri ayarlamak çoğu zaman false
iyi bir seçimdir, çünkü gerekmediğinde gereksiz işlem ve veritabanı sorgularını önler ve ilk kez özel alan / taksonomi terimleri gerektiğinde önbellek güncellenir.
Bununla birlikte, get_post_meta()
döngü boyunca bir kez bile arayacaksanız ve get_the_terms()
gönderiler tarafından desteklenen taksonomilerin tümünü (veya çoğunu) arayacaksanız , önbellek güncellemesi yine de tetiklenir ve bunun için gerçek bir fayda söz konusu olmayabilir. bu sorgu argümanlarını ayarlamak false
.
wp_reset_postdata()
, bir WP_Query sırasında bunun nedeniglobal $post
Object Cache'yi sıfırlamak ve sıfırlamak mı? Özel bir WP_Query yapmış olsaydım, yeni bir önbellek nesnesi yaratacaktı ama sıfırlamak da orijinal önbelleği almak için yeniden istenmek zorunda kalacak gibi geliyor. Ya da belki bu soru bağlamında çok uzağa gidiyorum.