WordPress, secara default, melakukan bentuk "Object Caching" tetapi masa pakainya hanya satu halaman.
Opsi sebenarnya adalah contoh yang sangat bagus untuk ini. Lihatlah jawaban ini untuk info lebih lanjut. Ringkasan:
- Halaman dimulai
- Semua opsi dimuat dengan
SELECT option_name, option_value from $wpdb->options
pernyataan sederhana
- Permintaan selanjutnya untuk opsi-opsi tersebut (mis. Panggilan untuk
get_option
tidak pernah menekan database karena disimpan dengan API cache WP.
Opsi selalu "hidup" dalam database dan selalu bertahan di sana - itulah sumber "kanonik" mereka. Yang mengatakan, opsi dimuat ke dalam objek cache sehingga ketika Anda meminta opsi ada kemungkinan 99% bahwa permintaan tidak akan pernah mencapai database.
Transien sedikit berbeda.
WordPress memungkinkan Anda untuk mengganti api cache dengan drop-in - file yang ditempatkan langsung di wp-content
folder Anda . Jika Anda membuat cache sendiri, drop in atau gunakan plugin yang ada , Anda dapat membuat cache objek bertahan lebih lama dari satu pemuatan halaman. Ketika Anda melakukan itu, transien, ubah sedikit.
Mari kita lihat set_transient
fungsi di wp-includes/option.php
.
<?php
/**
* Set/update the value of a transient.
*
* You do not need to serialize values. If the value needs to be serialized, then
* it will be serialized before it is set.
*
* @since 2.8.0
* @package WordPress
* @subpackage Transient
*
* @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the
* transient value to be stored.
* @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success.
*
* @param string $transient Transient name. Expected to not be SQL-escaped.
* @param mixed $value Transient value. Expected to not be SQL-escaped.
* @param int $expiration Time until expiration in seconds, default 0
* @return bool False if value was not set and true if value was set.
*/
function set_transient( $transient, $value, $expiration = 0 ) {
global $_wp_using_ext_object_cache;
$value = apply_filters( 'pre_set_transient_' . $transient, $value );
if ( $_wp_using_ext_object_cache ) {
$result = wp_cache_set( $transient, $value, 'transient', $expiration );
} else {
$transient_timeout = '_transient_timeout_' . $transient;
$transient = '_transient_' . $transient;
if ( false === get_option( $transient ) ) {
$autoload = 'yes';
if ( $expiration ) {
$autoload = 'no';
add_option( $transient_timeout, time() + $expiration, '', 'no' );
}
$result = add_option( $transient, $value, '', $autoload );
} else {
if ( $expiration )
update_option( $transient_timeout, time() + $expiration );
$result = update_option( $transient, $value );
}
}
if ( $result ) {
do_action( 'set_transient_' . $transient );
do_action( 'setted_transient', $transient );
}
return $result;
}
Hmmm $_wp_using_ext_object_cache
? Jika itu benar, WordPress menggunakan objek cache bukan database untuk menyimpan transien. Jadi bagaimana itu bisa menjadi kenyataan? Saatnya mengeksplorasi bagaimana WP mengatur API cache-nya sendiri.
Anda dapat melacak hampir semua hal untuk wp-load.php
atau wp-settings.php
- keduanya penting untuk proses bootstrap WordPress. Di cache kami, ada beberapa baris yang relevan di wp-settings.php
.
// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();
Ingat barang drop-in dari atas? Mari kita lihat wp_start_object_cache
di wp-includes/load.php
.
<?php
/**
* Starts the WordPress object cache.
*
* If an object-cache.php file exists in the wp-content directory,
* it uses that drop-in as an external object cache.
*
* @access private
* @since 3.0.0
*/
function wp_start_object_cache() {
global $_wp_using_ext_object_cache, $blog_id;
$first_init = false;
if ( ! function_exists( 'wp_cache_init' ) ) {
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once ( WP_CONTENT_DIR . '/object-cache.php' );
$_wp_using_ext_object_cache = true;
} else {
require_once ( ABSPATH . WPINC . '/cache.php' );
$_wp_using_ext_object_cache = false;
}
$first_init = true;
} else if ( !$_wp_using_ext_object_cache && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
// Sometimes advanced-cache.php can load object-cache.php before it is loaded here.
// This breaks the function_exists check above and can result in $_wp_using_ext_object_cache
// being set incorrectly. Double check if an external cache exists.
$_wp_using_ext_object_cache = true;
}
// If cache supports reset, reset instead of init if already initialized.
// Reset signals to the cache that global IDs have changed and it may need to update keys
// and cleanup caches.
if ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) )
wp_cache_switch_to_blog( $blog_id );
else
wp_cache_init();
if ( function_exists( 'wp_cache_add_global_groups' ) ) {
wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache' ) );
wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );
}
}
Baris fungsi yang relevan (yang berkaitan dengan $_wp_using_ext_object_cache
itu mengubah cara transien disimpan).
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once ( WP_CONTENT_DIR . '/object-cache.php' );
$_wp_using_ext_object_cache = true;
} else {
require_once ( ABSPATH . WPINC . '/cache.php' );
$_wp_using_ext_object_cache = false;
}
jika object-cache.php
ada di direktori konten Anda akan disertakan dan WP menganggap Anda menggunakan cache eksternal yang persisten - disetel $_wp_using_ext_object_cache
ke true.
Jika Anda menggunakan transien objek cache eksternal akan menggunakannya. Yang memunculkan pertanyaan kapan harus menggunakan opsi vs transien.
Sederhana. Jika Anda membutuhkan data untuk bertahan tanpa batas waktu, gunakan opsi. Mereka mendapatkan "cache", tetapi sumber kanonik mereka adalah database dan mereka tidak akan pernah pergi kecuali jika pengguna secara eksplisit memintanya.
Untuk data yang harus disimpan untuk jangka waktu tertentu, tetapi tidak perlu bertahan selama transien penggunaan seumur hidup yang ditentukan. Secara internal, WP akan mencoba menggunakan cache objek eksternal yang persisten, jika tidak, maka data akan masuk ke tabel opsi dan mengumpulkan sampah melalui psuedo-cron WordPress. ketika mereka kedaluwarsa.
Beberapa masalah / pertanyaan lain:
- Apakah saya tetap bisa melakukan banyak panggilan
get_option
?Mungkin. Mereka membuat panggilan ke fungsi overhead, tetapi kemungkinan tidak akan mencapai basis data. Pemuatan basis data sering kali merupakan masalah yang lebih besar dalam skalabilitas aplikasi web daripada pekerjaan yang dipilih oleh bahasa pilihan Anda.
- Bagaimana saya tahu menggunakan transien vs. API Cache? Jika Anda mengharapkan data bertahan selama periode yang ditentukan, gunakan API sementara. Jika tidak masalah jika data tetap ada (mis. Tidak butuh waktu lama untuk menghitung / mengambil data, tetapi seharusnya tidak terjadi lebih dari satu kali per pemuatan halaman) menggunakan API cache.
- Apakah semua opsi benar-benar di-cache pada setiap pageload? Belum tentu. Jika Anda menelepon
add_option
dengan argumen terakhir, opsional karena no
tidak diisi secara otomatis. Yang mengatakan, sekali Anda mengambilnya sekali, mereka masuk ke cache dan panggilan berikutnya tidak akan mencapai database.