ฟังก์ชัน get_option ถูกแคชหรือไม่


13

ในปลั๊กอินของฉันฉันใช้รหัสต่อไปนี้เพื่อดึงตัวเลือกจากฐานข้อมูล:

$options = get_option('my_plugin_options');

ถ้าฉันใช้ 10 ครั้งนี้ในฟังก์ชั่นต่าง ๆ ของปลั๊กอิน, WordPress ทำแบบสอบถาม 10 ข้อไปยังฐานข้อมูล, หรือใช้การโทรเพียง 1 ครั้งต่อการร้องขอ HTTP และแคชผลลัพธ์?

คำตอบ:


25

เมื่อสงสัยให้ดูซอร์สโค้ด

ขุดลงไปget_option()คุณจะเห็น (ตัวย่อ):

 $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 );
    }
}

อันดับแรก WordPress ตรวจสอบว่ามีตัวเลือกในหน่วยความจำอยู่แล้วหรือไม่ โดยค่าเริ่มต้นwp_cache_get()จะดึงค่าจากที่เก็บข้อมูลในหน่วยความจำ (โดยปกติจะเป็นเพียงตัวแปร PHP) แต่การติดตั้งบางอย่างใช้แคชวัตถุขั้นสูงที่เก็บข้อมูลที่อื่น

ในกรณีใดกรณีหนึ่งwp_cache_get()จะคืนค่าตัวเลือกของคุณหาก WordPress รู้อยู่แล้ว

ถ้าไม่เช่นนั้น WordPress จะพยายามดึงมันออกมาจากฐานข้อมูล หากมีตัวเลือกอยู่ในฐานข้อมูลแล้ว WordPress จะทำการแคชในหน่วยความจำและให้กลับมาทำให้การค้นหาเร็วขึ้น

หากไม่มีตัวเลือกในฐานข้อมูลแล้ว WordPress ตั้งค่าสถานะในอาร์เรย์ "ตัวเลือกเหล่านี้ไม่มีอยู่" ภายในดังนั้นจึงไม่ลองค้นหาในภายหลังและส่งคืนค่าเริ่มต้นแทน

ดังนั้นเพื่อตอบคำถามเดิมของคุณ:

ถ้าฉันใช้ 10 ครั้งนี้ในฟังก์ชั่นต่าง ๆ ของปลั๊กอิน, WordPress ทำแบบสอบถาม 10 ข้อไปยังฐานข้อมูล, หรือใช้การโทรเพียง 1 ครั้งต่อการร้องขอ HTTP และแคชผลลัพธ์?

WordPress จะทำการเรียกฐานข้อมูล 1 ครั้งต่อการร้องขอ HTTP และแคชผลลัพธ์


2

ใช่มันถูกแคช ดูแหล่งที่มาของฟังก์ชั่น มันเรียกwp_load_alloptions()ในพื้นหลังเพื่อดึงตัวเลือกทั้งหมดและฟังก์ชั่นนั้นจะเพิ่มผลลัพธ์ไปยังแคช:

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

ถ้าคุณดูที่ชั้นWP_Object_Cacheในคุณจะเห็นว่ามันเป็นไปได้สำหรับปลั๊กอินทุกคนที่จะเรียกวิธีสาธารณะwp-includes/cache.phpflush()

ในกรณีนี้ค่าตัวเลือกจะไม่ถูกแคชอีกต่อไปและget_option()จะทริกเกอร์การค้นหาฐานข้อมูลใหม่ ปลั๊กอินไม่ควรทำเช่นนี้ แต่เพื่อให้แน่ใจว่าคุณไม่ได้รับผลกระทบอย่าเรียกใช้แคชโดยตรงใช้เพียงget_option()เสมอ


ตัวเลือกที่ไม่ได้โหลดอัตโนมัติจะถูกแคชหลังจากครั้งแรกที่คุณค้นหา ดูคำตอบของฉันสำหรับคำอธิบายแบบเต็ม
EAMann

@EAMann ถูกต้องฉันแก้ไขมันออกมา
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.