Penjelasan dari update_post_ (meta / term) _cache

23

Saya membaca beberapa praktik terbaik dari 10up dan mereka menyebutkan pengaturan kedua flag ini menjadi false di WP_Query (tergantung pada apa yang Anda tanyakan):

  • 'update_post_meta_cache' => false: berguna ketika pos meta tidak akan digunakan.
  • 'update_post_term_cache' => false: berguna ketika ketentuan taksonomi tidak akan digunakan.

Saya berasumsi itu menggunakan sesuatu seperti update_post_caches()tapi saya bahkan tidak 100% yakin apa artinya itu. Bisakah seseorang menjelaskan apa arti kedua bendera ini WP_Querydan seberapa bermanfaatnya? Semakin banyak informasi semakin baik karena saya tidak tahu banyak tentang bagaimana WordPress menyimpan banyak hal tetapi jawaban yang dipikirkan dengan baik mengenai kedua bendera ini juga dapat diterima.

Howdy_McGee
sumber

Jawaban:

30

Cache objek di mana-mana

WordPress mencoba mengurangi jumlah permintaan basis data sebanyak mungkin.

Misalnya, kapan saja Anda mendapatkan bidang meta atau bidang taksonomi, sebelum menanyakan database, WordPress akan mencari apakah itu sudah ditanyakan dan disimpan dalam cache, dan mengembalikannya dari sana alih-alih meminta database.

"Pekerjaan cache" dilakukan melalui WP_Object_Cachekelas dan wp_cache_*fungsi (yang merupakan pembungkus metode kelas itu.)

Tempat tinggal cache

Secara default, "cache" tidak lebih dari variabel global PHP. Itu berarti bahwa itu ada dalam memori, tetapi juga berarti bahwa itu lenyap pada setiap permintaan.

Namun, melalui dropins ( advanced-cache.phpdan / atau object-cache.php), dimungkinkan untuk mengatur cara kustom untuk menangani cache ini.

Biasanya, dropins ini digunakan untuk mengatur semacam mekanisme caching yang "bertahan" dari permintaan tunggal.

Untuk alasan ini, di antara orang-orang WP, ini dikenal sebagai plugin "persistent cache" (bahkan di luar gelembung kata-kata "cache" dan "persistent" tidak membuat banyak akal bersama-sama).

Pilihan populer saat ini adalah Memcached atau Redis .

Jadi dengan menggunakan plugin "persistent cache" Anda dapat secara drastis mengurangi jumlah permintaan basis data, karena cache tidak diperbarui pada setiap permintaan.

Beberapa contoh

$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);

2 baris kode di atas akan memicu, maksimum, 1 permintaan basis data.

Bahkan, ketika Anda kueri bidang khusus, semua bidang untuk pos tersebut diambil dari basis data, di-cache melalui cache objek, dan permintaan selanjutnya menarik data dari cache dan bukan dari db.

Hal yang sama terjadi untuk istilah taksonomi, WordPress menarik semua ketentuan untuk taksonomi sekali, lalu mengembalikannya dari cache.

Cache objek digunakan sangat luas di WordPress. Tidak hanya untuk pos, nilai meta, dan taksonomi, tetapi juga untuk pengguna, komentar, data tema ...

Apa WP_Queryhubungannya dengan semua ini?

Ketika Anda meminta beberapa posting melalui WP_Query, secara default, WordPress tidak hanya menarik mereka dari database (atau dari cache jika mereka di-cache) tetapi juga memperbarui cache untuk semua bidang kustom dan semua taksonomi yang terkait dengan posting yang ditarik.

Jadi, ketika Anda menelepon, misalnya, get_the_terms()atau get_post_meta()ketika perulangan posting berhasil WP_Query, Anda sebenarnya tidak memicu kueri basis data, tetapi menarik informasi dari cache.

Bagus bukan?

Ya, tapi itu harus dibayar.

Cache memperbarui "sihir" yang dilakukan WordPress ketika menarik posting via WP_Queryterjadi di update_meta_cacheuntuk meta dan di update_object_term_cacheuntuk taksonomi.

Jika Anda melihat kode sumber fungsi-fungsi itu, Anda akan melihat bahwa di sana WordPress hanya melakukan satu permintaan db di setiap fungsi, tetapi juga melakukan banyak pemrosesan. Sebagai contoh, di update_object_term_cachesana ada 7 bersarangforeach ... jika Anda memiliki banyak taksonomi, dan jumlah posting per halaman tinggi, ini tidak terlalu performant.

Tentang WP_Queryargumen itu, akhirnya

Apa 'update_post_meta_cache'dan apa yang 'update_post_term_cache'dilakukan ketika diatur untuk falsemencegah WordPress memperbarui cache untuk masing-masing bidang kustom dan taksonomi.

Dalam kasus itu, pertama kali bidang kustom atau taksonomi ditanya kueri basis data dipicu, dan data di-cache.

Itu sepadan dengan masalahnya?

Seperti biasa, jawabannya tergantung . Sebagian besar waktu untuk menetapkan nilai-nilai itu false, adalah pilihan yang baik, karena itu mencegah pemrosesan dan permintaan basis data yang tidak perlu jika tidak diperlukan, dan cache diperbarui pula pula saat pertama kali bidang khusus / taksonomi diperlukan.

Namun, jika Anda akan menelepon, bahkan sekali, get_post_meta()selama loop dan Anda akan memanggil get_the_terms()untuk semua (atau sebagian besar) taksonomi yang didukung oleh posting, maka pembaruan cache dipicu pula, dan mungkin tidak ada manfaat aktual pada mengatur argumen kueri tersebut ke false.

gmazzap
sumber
Rapi! Seperti biasa wawasan Anda selalu dihargai GM. Apakah transien dianggap "cache persisten"? Jadi untuk melangkah lebih jauh, selama WP_Query alasannya wp_reset_postdata()adalah untuk mereset global $postdan mereset Object Cache? Kedengarannya seperti jika saya melakukan WP_Query kustom itu akan membuat objek cache baru tetapi mengatur ulang juga harus meminta kembali untuk mendapatkan cache asli. Atau mungkin saya terlalu jauh dalam konteks pertanyaan ini.
Howdy_McGee
1
@Howdy_McGee Tembolok objek dan objek pos tidak terkait. Jadi wp_reset_postdata()jangan lakukan apapun dalam hal cache objek. wp_reset_postdata()hanya mengatur ulang objek pos global, yang merupakan variabel global lain, yang tidak pernah di-cache ... Transien adalah hal hibrid: ketika Anda memiliki beberapa plugin cache yang persisten terpasang, gunakan sementara itu, tetapi jika Anda tidak memiliki plugin cache yang persisten, maka transien gunakan basis data.
gmazzap
Ah, saya hanya mengaitkan pada global variablegagasan dan menganggap itu adalah objek global $postglobal $wp_query, terima kasih atas klarifikasi!
Howdy_McGee
Pada sidenote , fields => 'ids'set kedua cache ke false. Saya kira masuk akal bahwa Object Cache hanya bekerja pada Objects tapi saya pikir saya hanya akan menyebutkan: D
Howdy_McGee
3

Poin utama yang menarik di sini adalah update_post_cachesfungsinya. Ini dipanggil setelah WP_Query mendapatkan semua posting dari DB. Biasanya, alasan Anda menginginkan posting di tempat pertama adalah untuk menampilkannya yang biasanya berarti menampilkan istilah dan sesuatu berdasarkan metadata, karenanya WP_Query juga akan secara default meminta DB untuk meta dan data istilah terkait dengan posting yang dikembalikan dan menyimpannya cache *. Informasi ini tidak tersedia secara eksplisit dalam data yang dikembalikan dari WP_Query, tetapi ketika Anda akan memanggil API yang relevan untuk mendapatkan istilah dan meta info dari posting tertentu, itu akan sudah tersedia dalam memori dan tidak perlu mengirim yang baru permintaan ke DB.

Ini memungkinkan wordpress untuk mengurangi overhead yang terkait dengan mengirim permintaan ke DB dengan mengirimkan hanya satu permintaan untuk mendapatkan informasi untuk semua posting daripada mengirim permintaan per setiap posting.

Saat ini saya tidak dapat menemukan contoh non sepele kapan Anda tidak ingin cache diperbarui, tetapi mungkin sepele jika Anda hanya ingin daftar judul semua posting. Untuk itu Anda tidak perlu data istilah atau meta.

* cache - Yang terpenting di sini adalah cache berbasis memori di mana WP menyimpan banyak hal yang didapat dari DB bahkan tanpa plugin caching objek apa pun aktif. Jelas ketika Anda memiliki objek caching informasi tersebut akan disimpan di sana juga.

Mark Kaplun
sumber