Update_post_ (meta / term) _cache açıklaması


23

10up'tan bazı en iyi uygulamaları okuyordum ve bu iki bayrağı bir WP_Query'de (ne sorguladığınıza bağlı olarak) yanlış yapmaktan bahsediyorlardı :

  • 'update_post_meta_cache' => false: post meta kullanılmayacaksa kullanışlıdır.
  • 'update_post_term_cache' => false: Taksonomi terimlerinin kullanılmayacağı durumlarda kullanışlıdır.

Bunun gibi bir şey kullandığını farz ediyorum update_post_caches()ama bunun ne anlama geldiğinden% 100 emin bile değilim. Biri bu iki bayrak ne anlama geldiğini WP_Queryve ne kadar yararlı olduklarını açıklayabilir mi? Daha fazla bilgi, WordPress’in işleri nasıl önbelleğe aldığı hakkında çok fazla şey bilmediğim kadar iyi, ancak bu iki bayrakla ilgili iyi düşünülmüş bir cevap da kabul edilebilir.

Yanıtlar:


30

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_Cachesı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.phpve / 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_Queryilgisi var?

Bazı gönderileri WP_Queryvarsayı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_Querygerçekleştiği zaman yaptığı “sihir” .update_meta_cacheupdate_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_cacheorada 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_QuerySonunda bu argümanlar hakkında

Ne 'update_post_meta_cache've 'update_post_term_cache'ayarlandığında yapmak falsesı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 falseiyi 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.


Temiz! Her zaman olduğu gibi içgörünüz her zaman GM tarafından takdir edilir. Geçici olaylar "kalıcı önbellek" olarak kabul edilir mi? Öyleyse daha da ileri gitmek için wp_reset_postdata(), bir WP_Query sırasında bunun nedeni global $postObject 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.
Howdy_McGee

1
@Howdy_McGee Nesne önbelleği ve post nesnesi ilişkili değil. Öyleyse wp_reset_postdata()nesne önbelleği konusunda hiçbir şey yapmayın. wp_reset_postdata()yalnızca global post nesnesini sıfırla, bu da başka bir global değişken değil, hiçbir zaman önbelleğe alınmamış ... Geçici olaylar hibrit bir şeydir: takılı bazı önbellek eklentisi yüklü olduğunda, geçici kullanım bunu kullanır, ancak kalıcı bir önbellek eklentiniz yoksa, geçici veritabanını kullan.
gmazzap

Ah, sadece üzerine kilitlenmiş global variablekavramına ve öyleydi farz global $postveya küresel $wp_query, nesneler açıklama için teşekkürler!
Howdy_McGee

Bir sidenote üzerinde , fields => 'ids'her iki önbelleği de ayarlar false. Bir Nesne Önbelleğinin yalnızca Nesneler üzerinde çalıştığını düşünmüştüm ama sadece bir şey söyleyeceğimi düşündüm: D
Howdy_McGee

3

Buradaki ana ilgi alanı update_post_cachesişlevdir. WP_Query DB'den tüm mesajları aldıktan sonra çağrılır. Genellikle, gönderilerin ilk sırada olmasını istemenin nedeni, onları görüntülemektır; bu, genellikle terimleri ve meta verileri temel alan bir şeyi görüntülemek anlamına gelir; bunun için WP_Query, aynı zamanda, varsayılan olarak, döndürülen yazılarla ilgili meta ve terim verileri için DB'yi sorgulayacaktır. ve önbelleği saklar *. Bu bilgi WP_Query'den döndürülen verilerde açıkça mevcut değildir, ancak belirli bir gönderinin terim ve meta bilgisini almak için ilgili API'leri arayacaksanız, bellekte zaten mevcut olacak ve yeni bir mesaj göndermeye gerek kalmayacak DB sorgusu.

Bu, Wordpress'in DB'ye istek gönderme ile ilgili ek yükü azaltmasını, her gönderi için bir istek göndermek yerine tüm gönderiler için bilgileri almak üzere yalnızca bir istek göndermesini sağlar.

Şu anda önbelleğin ne zaman güncellenmesini istemeyeceğinize dair önemsiz bir örnek bulamıyorum, ancak önemsiz bir örnek, tüm yayınların başlıklarının bir listesini görmek istiyorsanız olabilir. Bunun için terim veya meta verilere ihtiyacınız yoktur.

* önbellek - Burada en önemlisi, WP'nin depoladığı bellek tabanlı önbellek, herhangi bir nesne önbellek eklentisi etkin olmasa bile, DB'den aldığı her şeyi alot almasıdır. Açıkçası, önbelleğe alma nesnesine sahip olduğunuzda bilgiler de orada saklanır.

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.