Apakah fungsi get_option di-cache?

13

Di plugin saya, saya menggunakan kode berikut untuk mengambil opsi dari database:

$options = get_option('my_plugin_options');

Jika saya menggunakan ini 10 kali dalam berbagai fungsi plugin saya, apakah WordPress membuat 10 pertanyaan ke database, atau apakah itu hanya membuat 1 panggilan database per permintaan HTTP dan menyimpan hasilnya?

Ben Miller - Pasang kembali Monica
sumber

Jawaban:

25

Jika ragu, lihat kode sumbernya.

Menggali get_option(), Anda akan melihat (disingkat):

 $value = wp_cache_get( $option, 'options' );

if ( false === $value ) {
    $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );

    // Has to be get_row instead of get_var because of funkiness with 0, false, null values
    if ( is_object( $row ) ) {
        $value = $row->option_value;
        wp_cache_add( $option, $value, 'options' );
    } else { // option does not exist, so we must cache its non-existence
        $notoptions[$option] = true;
        wp_cache_set( 'notoptions', $notoptions, 'options' );
        return apply_filters( 'default_option_' . $option, $default );
    }
}

Pertama, WordPress memeriksa untuk melihat apakah sudah ada opsi di memori. Secara default, wp_cache_get()akan mengambil nilai dari penyimpanan data dalam memori (biasanya hanya variabel PHP). Tetapi beberapa instalasi menggunakan cache objek yang lebih canggih yang menyimpan data di tempat lain.

Dalam kedua kasus, wp_cache_get()akan mengembalikan nilai opsi Anda jika WordPress sudah mengetahuinya.

Jika tidak, maka WordPress akan mencoba mengambilnya dari database. Jika opsi ada di DB, maka WordPress akan menyimpannya dalam memori dan mengembalikannya - membuat pencarian berikutnya lebih cepat.

Jika opsi tidak ada dalam database, maka WordPress menandainya dalam array internal "opsi ini tidak ada" sehingga tidak mencoba untuk mencarinya nanti dan mengembalikan beberapa nilai default sebagai gantinya.

Jadi, untuk menjawab pertanyaan awal Anda:

Jika saya menggunakan ini 10 kali dalam berbagai fungsi plugin saya, apakah WordPress membuat 10 pertanyaan ke database, atau apakah itu hanya membuat 1 panggilan database per permintaan HTTP dan menyimpan hasilnya?

WordPress akan membuat 1 panggilan basis data per permintaan HTTP dan menyimpan hasilnya.

EAMann
sumber
2

Ya, ini di-cache. Lihatlah sumber fungsinya. Itu panggilan wp_load_alloptions()di latar belakang, untuk mengambil semua opsi, dan fungsi itu menambahkan hasilnya ke cache:

wp_cache_add( 'alloptions', $alloptions, 'options' );

Jika Anda melihat kelas WP_Object_Cachedi wp-includes/cache.php, Anda akan melihat, adalah mungkin untuk setiap plugin untuk memanggil metode publik flush().

Dalam hal ini nilai opsi tidak di-cache lagi, dan get_option()akan memicu pencarian basis data baru. Plugin seharusnya tidak melakukan ini, tetapi untuk memastikan Anda tidak terpengaruh, jangan panggil cache secara langsung, selalu gunakan saja get_option().

fuxia
sumber
Selain itu, opsi yang tidak dimuat secara otomatis akan di-cache setelah pertama kali Anda melihatnya. Lihat jawaban saya untuk deskripsi lengkap.
EAMann
@ EAMann Benar, saya mengeditnya.
fuxia