क्या get_option फ़ंक्शन कैश किया गया है?


13

मेरे प्लगइन में, मैं डेटाबेस से एक विकल्प को पुनः प्राप्त करने के लिए निम्न कोड का उपयोग करता हूं:

$options = get_option('my_plugin_options');

यदि मैं अपने प्लगइन के विभिन्न कार्यों में 10 बार उपयोग करता हूं, तो क्या वर्डप्रेस डेटाबेस में 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 );
    }
}

सबसे पहले, वर्डप्रेस यह देखने के लिए जांचता है कि क्या उसके पास पहले से ही मेमोरी में विकल्प है। डिफ़ॉल्ट रूप से, wp_cache_get()इन-मेमोरी डेटा स्टोर (आमतौर पर सिर्फ एक PHP चर) से मूल्यों को पुनः प्राप्त करेगा। लेकिन कुछ इंस्टॉलेशन एक अधिक उन्नत ऑब्जेक्ट कैश का उपयोग करते हैं जो डेटा को कहीं और संग्रहीत करता है।

किसी भी स्थिति में, wp_cache_get()यदि आपका वर्डप्रेस पहले से ही जानता है तो आपके विकल्प का मूल्य वापस कर देगा।

यदि नहीं, तो वर्डप्रेस डेटाबेस से इसे हथियाने की कोशिश करेगा। यदि विकल्प DB में मौजूद है, तो वर्डप्रेस इसे मेमोरी में कैश करेगा और फिर इसे वापस दे देगा - बाद के लुकअप को तेजी से बना देगा।

यदि विकल्प डेटाबेस में मौजूद नहीं है, तो वर्डप्रेस इसे एक आंतरिक "इन विकल्पों में मौजूद नहीं है" सरणी में फ़्लैग करता है, इसलिए यह इसे बाद में देखने की कोशिश नहीं करता है और इसके बजाय कुछ डिफ़ॉल्ट मान देता है।

तो, अपने मूल प्रश्न का उत्तर देने के लिए:

यदि मैं अपने प्लगइन के विभिन्न कार्यों में 10 बार उपयोग करता हूं, तो क्या वर्डप्रेस डेटाबेस में 10 प्रश्न करता है, या क्या यह केवल 1 डेटाबेस कॉल प्रति HTTP अनुरोध करता है और परिणामों को कैश करता है?

वर्डप्रेस 1 HTTP कॉल प्रति HTTP अनुरोध करेगा और परिणामों को कैश करेगा।


2

हां, यह कैश्ड है। फ़ंक्शन के स्रोत को देखें। यह wp_load_alloptions()सभी विकल्पों को लाने के लिए पृष्ठभूमि में कॉल करता है, और यह फ़ंक्शन परिणाम को कैश में जोड़ता है:

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

आप वर्ग को देखें, तो WP_Object_Cacheमें wp-includes/cache.php, आप देखेंगे, यह संभव है कि हर प्लगइन सार्वजनिक विधि कॉल करने के लिए flush()

इस स्थिति में विकल्प मान को अब कैश नहीं किया गया है, और get_option()एक नया डेटाबेस लुकअप ट्रिगर करेगा। प्लगइन्स को ऐसा नहीं करना चाहिए, लेकिन यह सुनिश्चित करने के लिए कि आप प्रभावित नहीं हैं, कैश को सीधे कॉल न करें, हमेशा उपयोग करें get_option()


इसके अलावा, जो विकल्प ऑटो-लोडेड नहीं हैं, उन्हें पहली बार देखने के बाद कैश किया जाएगा। पूर्ण विवरण के लिए मेरा उत्तर देखें ।
इमान

@Eamann सही, मैंने इसे संपादित किया।
FUXIA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.