Get_option ফাংশন ক্যাশেড হয়?


13

আমার প্লাগ ইন, আমি ডাটাবেস থেকে একটি বিকল্প পুনরুদ্ধার করতে নিম্নলিখিত কোড ব্যবহার:

$options = get_option('my_plugin_options');

যদি আমি এটি আমার প্লাগিনের বিভিন্ন কার্যক্রমে 10 বার ব্যবহার করি, ওয়ার্ডপ্রেসটি কি ডেটাবেজে 10 টি প্রশ্ন করে বা এটি এইচটিটিপি অনুরোধের জন্য কেবল 1 টি ডাটাবেস কল করে এবং ফলাফলগুলি ক্যাশে করে?

উত্তর:


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()একটি মেমরির ডেটা স্টোর (সাধারণত কেবলমাত্র একটি পিএইচপি ভেরিয়েবল) থেকে মানগুলি পুনরুদ্ধার করবে। তবে কিছু ইনস্টলেশন আরও উন্নত অবজেক্ট ক্যাশে ব্যবহার করে যা ডেটা অন্য কোথাও সঞ্চয় করে।

উভয় ক্ষেত্রেই wp_cache_get()যদি ওয়ার্ডপ্রেস ইতিমধ্যে এটি জানে তবে আপনার বিকল্প মানটি ফিরিয়ে দেবে।

যদি তা না হয় তবে ওয়ার্ডপ্রেস এটি ডাটাবেস থেকে ধরার চেষ্টা করবে। যদি বিকল্পটি ডিবিতে বিদ্যমান থাকে, তবে ওয়ার্ডপ্রেস এটিকে মেমরির আকারে ক্যাশে করবে এবং তারপরে এটি ফিরিয়ে দেবে - পরবর্তী তাত্ক্ষণিকতা দ্রুত তৈরি করে।

যদি ডাটাবেসে বিকল্পটি উপস্থিত না থাকে, তবে ওয়ার্ডপ্রেস এটি অভ্যন্তরীণ "এই বিকল্পগুলির অস্তিত্ব নেই" অ্যারেতে ফ্ল্যাগ করে তাই এটি পরে দেখার চেষ্টা করে না এবং পরিবর্তে কিছু ডিফল্ট মান প্রদান করে।

সুতরাং, আপনার মূল প্রশ্নের উত্তর দিতে:

যদি আমি এটি আমার প্লাগিনের বিভিন্ন কার্যক্রমে 10 বার ব্যবহার করি, ওয়ার্ডপ্রেসটি কি ডেটাবেজে 10 টি প্রশ্ন করে বা এটি এইচটিটিপি অনুরোধের জন্য কেবল 1 টি ডাটাবেস কল করে এবং ফলাফলগুলি ক্যাশে করে?

ওয়ার্ডপ্রেস প্রতি HTTP অনুরোধের জন্য 1 টি ডাটাবেস কল করবে এবং ফলাফলগুলিকে ক্যাশে করবে।


2

হ্যাঁ, এটি ক্যাশেড ফাংশনের উত্স দেখুন। এটি wp_load_alloptions()সমস্ত বিকল্প আনতে ব্যাকগ্রাউন্ডে কল করে এবং এই ফাংশনটি ক্যাশে ফলাফল যুক্ত করে:

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

তুমি ক্লাসে তাকান WP_Object_Cacheমধ্যে wp-includes/cache.phpআপনি দেখে নিবেন, এটা কি সম্ভব যে প্লাগইন প্রকাশ্য পদ্ধতি কল জন্য flush()

এই ক্ষেত্রে বিকল্প মানটি আর ক্যাশে করা হয় না এবং get_option()এটি একটি নতুন ডাটাবেস অনুসন্ধান সন্ধান করে। প্লাগইনগুলি এটি করা উচিত নয়, তবে আপনি প্রভাবিত না হয়েছেন তা নিশ্চিত হতে, সরাসরি ক্যাশে কল করবেন না, সর্বদা ন্যায় ব্যবহার করুন get_option()


এছাড়াও, অটো-লোড করা হয়নি এমন বিকল্পগুলি প্রথমবার আপনি তাদের দেখার পরে ক্যাশে হবে। সম্পূর্ণ বিবরণের জন্য আমার উত্তর দেখুন ।
ইমান

@ এমানান সঠিক, আমি এটি সম্পাদনা করেছি।
ফুসিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.