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_Cache
kelas 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.php
dan / 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_Query
hubungannya 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_Query
terjadi di update_meta_cache
untuk meta dan di update_object_term_cache
untuk 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_cache
sana ada 7 bersarangforeach
... jika Anda memiliki banyak taksonomi, dan jumlah posting per halaman tinggi, ini tidak terlalu performant.
Tentang WP_Query
argumen itu, akhirnya
Apa 'update_post_meta_cache'
dan apa yang 'update_post_term_cache'
dilakukan ketika diatur untuk false
mencegah 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
.
wp_reset_postdata()
adalah untuk meresetglobal $post
dan 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.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.global variable
gagasan dan menganggap itu adalah objekglobal $post
global$wp_query
, terima kasih atas klarifikasi!fields => 'ids'
set kedua cache kefalse
. Saya kira masuk akal bahwa Object Cache hanya bekerja pada Objects tapi saya pikir saya hanya akan menyebutkan: DPoin utama yang menarik di sini adalah
update_post_caches
fungsinya. 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.
sumber