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.