ऑब्जेक्ट कैशिंग कैसे काम करता है?


21

मैं यहाँ एक निश्चित उत्तर की तलाश में हूँ। जब ऑब्जेक्ट कैशिंग सक्षम होता है, तो विकल्प और ग्राहक कहां रहते हैं?

डिफ़ॉल्ट रूप से, दोनों डेटाबेस में संग्रहीत होते हैं। लेकिन मैंने कुछ संदर्भों को सुना है कि मेमेचे उन्हें कहीं और स्टोर करेगा और एपीसी पूरी तरह से कुछ और करेगा। कहां, वास्तव में , क्या यह डेटा दोनों मामलों में जारी रहेगा?


2
लेख @toscho का उल्लेख अब आर्काइव.ऑर्ग पर उपलब्ध है : वर्डप्रेस कैश एपीआई की खोज
यहाँ

जवाबों:


34

डिफ़ॉल्ट रूप से, वर्डप्रेस "ऑब्जेक्ट कैशिंग" का एक रूप है, लेकिन इसका जीवनकाल केवल एक पृष्ठ लोड है।

विकल्प वास्तव में इसका एक बहुत अच्छा उदाहरण हैं। की जाँच करें इस उत्तर अधिक जानकारी के लिए। सारांश:

  1. एक पेज शुरू होता है
  2. सभी विकल्प एक साधारण SELECT option_name, option_value from $wpdb->optionsविवरण के साथ लोड किए गए हैं
  3. उन विकल्पों के लिए अनुवर्ती अनुरोध (उदाहरण के get_optionलिए डेटाबेस को कभी भी हिट न करने के लिए एक कॉल क्योंकि वे WP कैश एपीआई के साथ संग्रहीत हैं।

विकल्प हमेशा डेटाबेस में "लाइव" होते हैं और हमेशा वहां बने रहते हैं - यही उनका "विहित" स्रोत है। उस ने कहा, विकल्प ऑब्जेक्ट कैश में लोड किए जाते हैं, इसलिए जब आप एक विकल्प का अनुरोध करते हैं तो 99% संभावना होती है जो अनुरोध डेटाबेस को कभी भी हिट नहीं करेगा।

ग्राहक थोड़े अलग हैं।

वर्डप्रेस आपको कैश-एआई को ड्रॉप-इन के साथ बदलने की अनुमति देता है - एक फाइल जो सीधे आपके wp-contentफ़ोल्डर में रखी जाती है । यदि आप अपना कैश ड्रॉप बनाते हैं या किसी मौजूदा प्लगइन का उपयोग करते हैं , तो आप ऑब्जेक्ट कैश को एक पेज लोड से अधिक समय तक बनाये रख सकते हैं। जब आप ऐसा करते हैं, तो ग्राहक, थोड़ा बदल जाते हैं।

चलो set_transientसमारोह में एक नज़र रखना 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;
}

हम्म $_wp_using_ext_object_cache? यदि यह सच है, तो वर्डप्रेस, कैश का उपयोग डेटाबेस को स्टोर करने के लिए ऑब्जेक्ट के बजाय करता है । तो यह कैसे सच हो जाता है? यह पता लगाने का समय कि WP अपनी कैश एपीआई कैसे सेट करता है।

आप वर्डप्रेस की बूटस्ट्रैप प्रक्रिया के लिए महत्वपूर्ण हैं - wp-load.phpया wp-settings.phpदोनों लगभग सभी को ट्रेस कर सकते हैं। हमारे कैश में, कुछ प्रासंगिक लाइनें हैं wp-settings.php

// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();

याद रखें कि ऊपर से चीज़ में गिरावट? आइए एक नजर डालते wp_start_object_cacheहैं 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' ) );
    }
}

फ़ंक्शन की प्रासंगिक रेखाएं (जो कि उस अलर्ट से संबंधित हैं जो $_wp_using_ext_object_cacheकि कैसे ग्राहकों को संग्रहीत किया जाता है)।

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

यदि object-cache.phpआपकी सामग्री निर्देशिका में यह शामिल है और WP मान लेता है कि आप बाहरी, लगातार कैश का उपयोग कर रहे हैं - तो यह $_wp_using_ext_object_cacheसच हो जाता है।

यदि आप किसी बाहरी वस्तु का उपयोग कर रहे हैं तो कैश ग्राहक इसका उपयोग करेंगे। विकल्प बनाम ट्रांज़िस्टर का उपयोग कब करना है, यह सवाल उठता है।

सरल। यदि आपको अनिश्चित काल तक जारी रखने के लिए डेटा की आवश्यकता है, तो विकल्पों का उपयोग करें। उन्हें "कैश्ड" मिलता है, लेकिन उनके विहित स्रोत डेटाबेस हैं और वे तब तक दूर नहीं होंगे जब तक कि उपयोगकर्ता स्पष्ट रूप से अनुरोध नहीं करता है।

ऐसे डेटा के लिए जिन्हें समय की एक निर्धारित राशि के लिए संग्रहित किया जाना चाहिए, लेकिन एक निर्दिष्ट जीवनकाल उपयोग के पारगमन से परे बने रहने की आवश्यकता नहीं है। आंतरिक रूप से, WP एक बाहरी, लगातार ऑब्जेक्ट कैश का उपयोग करने का प्रयास करेगा यदि यह अन्यथा डेटा विकल्प तालिका में जाएगा और जब वे समाप्त हो जाएंगे तब वर्डप्रेस के प्यूसीडो-क्रोन के माध्यम से एकत्र कचरा प्राप्त होगा।

कुछ अन्य चिंताएँ / प्रश्न:

  1. क्या एक टन कॉल करना ठीक है get_option? शायद। वे कॉल को एक फ़ंक्शन ओवरहेड पर ले जाते हैं, लेकिन यह संभवतः डेटाबेस को हिट नहीं करेगा। डेटाबेस लोड अक्सर वेब एप्लिकेशन स्केलेबिलिटी में एक बड़ी चिंता का विषय है कि आपकी पसंद की भाषा एक पेज का निर्माण करती है।
  2. मैं कैश एपीआई बनाम ट्रांजिस्टर का उपयोग कैसे कर सकता हूं? यदि आप डेटा को एक निर्धारित अवधि तक बनाए रखने की अपेक्षा करते हैं, तो क्षणिक API का उपयोग करें। यदि डेटा बना रहता है, तो यह कोई मायने नहीं रखता (उदाहरण के लिए, डेटा की गणना / प्राप्त करने में लंबा समय नहीं लगता है, लेकिन यह प्रति पृष्ठ लोड से अधिक होने पर नहीं होना चाहिए) कैश एपीआई का उपयोग करें।
  3. क्या सभी विकल्प वास्तव में हर पगेलोड पर कैश्ड हैं? जरुरी नहीं। यदि आप add_optionइसके अंतिम, वैकल्पिक तर्क के साथ कहते हैं , क्योंकि noवे ऑटोलॉइड नहीं हैं। उस ने कहा, एक बार आप उन्हें लाने के बाद, वे कैश में चले जाते हैं और बाद में कॉल डेटाबेस को हिट नहीं करेंगे।

नाइटपिक 1: पेज शुरू होने पर सभी विकल्प लोड नहीं किए जाते हैं, लेकिन केवल वे ही बनाए जाते हैं जिन्हें "ऑटोलॉड = हां" चिह्नित किया जाता है। Add_option में उस पैरामीटर के लिए डिफ़ॉल्ट 'हां' है और अधिकांश प्लगइन लेखक 'नहीं' का उपयोग करने में अंतर को समझने की जहमत नहीं उठाते हैं, जिससे आपका कथन व्यावहारिक रूप से सत्य हो जाता है।
मार्क कप्लून

यहां तक ​​कि एक बार लाने के बाद भी गैर-ऑटोलॉइड विकल्प को कैश किया जाता है। उन्हें शुरू में लोड नहीं किया जा सकता है, लेकिन वे उसके बाद ऑब्जेक्ट कैश में चले जाते हैं। विकल्प भी मौजूद नहीं है कि कैश नहीं हैं! github.com/WordPress/WordPress/blob/master/wp-includes/… मैंने हालांकि ऑटोलैड विकल्प के बारे में एक नोट जोड़ा।
क्रिस्सिटेरिटगुई

वह नाइटपिक 2 था;)
मार्क कपलुन

महान लेख के लिए धन्यवाद, और समय के लिए संक्षेप में यह सब।
प्रोस्टी

5

4 कैश प्रकार हैं जो मुझे पता है

  1. तुच्छ - यह किसी भी अन्य कैचिंग में आने से पहले हमेशा चालू रहता है और प्रभावित करता है। यह कैश्ड आइटम को php एरे में संग्रहीत करता है जिसका अर्थ है कि यह आपके php एक्स्टेंशन सत्र से मेमोरी की खपत करता है, और php निष्पादन समाप्त होने के बाद कैश को खाली कर दिया जाता है। यदि आप किसी पंक्ति में दो बार get_option ('ऑप्ट') कॉल करते हैं, तो भी बिना किसी अन्य कैश का उपयोग किए बिना, आप पहली बार केवल एक DB क्वेरी करेंगे और दूसरी बार मान को स्मृति से वापस कर दिया जाएगा।

  2. फ़ाइल - कैश्ड मान आपके रूट डायरेक्टरी के तहत कहीं फाइलों में संग्रहीत हैं। मेरा मानना ​​है कि यह प्रदर्शन के मामले में तब तक कारगर साबित नहीं हुआ जब तक आपके पास बहुत तेज़ डिस्क या मेमोरी मैप्ड फ़ाइल स्टोरेज न हो।

  3. APC (या अन्य php त्वरक आधारित कैशिंग) - कैश्ड मान आपके होस्ट मशीन की मेमोरी में और आपके php मेमोरी आवंटन के बाहर संग्रहीत होते हैं। सबसे बड़ी संभावित खराबी यह है कि डेटा का कोई स्कूप नहीं है और यदि आप दो साइट चलाते हैं तो संभवतः प्रत्येक दूसरे के कैश्ड डेटा तक पहुँच सकते हैं, या इसे अधिलेखित कर सकते हैं।

  4. Memcache - यह एक नेटवर्क आधारित कैश है। आप नेटवर्क पर कहीं भी कैशिंग सेवा चला सकते हैं और यह संभवतः इसकी होस्ट मेमोरी में मान संग्रहीत करता है। जब तक आपके पास एक्शन में लोड संतुलन न हो, आपको शायद मेमेचे की ज़रूरत नहीं है।

BTW, ऑब्जेक्ट कैशिंग विकल्पों की तुलना में बहुत अधिक कैशिंग कर रहा है, यह उच्च स्तर के WP API का उपयोग करके DB से प्राप्त की गई लगभग किसी भी चीज़ को संग्रहीत करेगा।


मुझे पता है कि उत्तर काफी पुराना है, लेकिन मैं उत्कृष्ट रेडिस भी जोड़ूंगा
क्रैनियो

@ क्रानियो, आप सही हैं लेकिन ... रेडिस मूल रूप से स्टोरेज के साथ एक प्रकार का मेमोशे है, और इसके बाद यह एक (NoSQL) DB है। यह IMHO वास्तव में बुरा है क्योंकि यदि नोड विफल हो जाता है या अपडेट नहीं किया जा सकता है तो आपको इससे बासी जानकारी मिल सकती है। यह डीबी को व्यवहार की तरह बंद करने का एक विकल्प है, लेकिन मुझे यकीन नहीं है कि यह डिफ़ॉल्ट रूप से चालू या बंद है।
मार्क कप्लून

यह मेम्केड के लिए एक सही प्रतिस्थापन है (और भी बेहतर), आपको और क्या चाहिए? अब तक मैंने जो सबसे आम उपयोग देखा है, वह रैम की-वैल्यू स्टोरेज के रूप में है (हाँ, इसके अलावा, डेटा को लगातार बनाया जा सकता है, क्लस्टरिंग रास्ते में है, और कतार प्रबंधन क्षमताएं हैं, लेकिन हर कोई एक उत्कृष्ट के रूप में Redis को जोड़ता है। WP के लिए कैशिंग विकल्प)
Cranio

हर कोई पुल से कूद भी सकता है;) लेकिन जोड़ा जटिलता पूरी तरह से कैशिंग के लिए आवश्यक नहीं है
मार्क कपलुन

वह पूरी तरह से व्यर्थ है; आप रैम कैशिंग चाहते हैं, रेडिस रैम कैशिंग, अवधि; और यह आश्चर्यजनक रूप से करता है। इसमें कोई जटिलता है, तो आप इसके लिए जाने के लिए नहीं करना चाहती। तो, श्रीमान, मैं आपकी बात समझने में वास्तव में विफल हूं।
क्रैनियो

0

विकल्प हमेशा डेटाबेस में संग्रहीत किए जाते हैं, जबकि एपीसी में एक एपीसी कैशिंग स्थापित करने वाले एपीसी और एक प्लगइन स्थापित होने पर, केवल साझा मेमोरी में ही स्टोर किया जा सकता है। मेमचेस मेमोरी का भी उपयोग करता है।

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


0

बड़ा सवाल है।

मुझे लगता है कि वर्डप्रेस का उपयोग करने वाला WP_Object_Cacheवर्ग अभी भी गायब है, इसलिए मैं इसे जोड़ूंगा।

डॉक्स से:

DEF: डाटाबेस में यात्राओं को सहेजने के लिए वर्डप्रेस ऑब्जेक्ट कैश का उपयोग किया जाता है। ऑब्जेक्ट कैश कैश मेमोरी के सभी डेटा को संग्रहीत करता है और एक कुंजी का उपयोग करके कैश सामग्री उपलब्ध कराता है, जिसका उपयोग कैश सामग्री को नाम देने और बाद में करने के लिए किया जाता है।

यहाँ WP_Object_Cacheसंरचना है।

यहाँ छवि विवरण दर्ज करें

नोट + सार्वजनिक है, - निजी, # संरक्षित।

आप stats()वैश्विक कैश ऑब्जेक्ट के बारे में सामान्य आंकड़े दिखाने के लिए विधि का उपयोग करते हैं और इसमें क्या है। यहाँ उत्पादन है:

Cache Hits: 110
Cache Misses: 98

Group: options - ( 81.03k )
Group: default - ( 0.03k )
Group: users - ( 0.41k )
Group: userlogins - ( 0.03k )
Group: useremail - ( 0.04k )
Group: userslugs - ( 0.03k )
Group: user_meta - ( 3.92k )
Group: posts - ( 1.99k )
Group: terms - ( 1.76k )
Group: post_tag_relationships - ( 0.04k )
Group: category_relationships - ( 0.03k )
Group: post_format_relationships - ( 0.02k )
Group: post_meta - ( 0.36k )

यह मुझे पहले एक खाके की शुरुआत में मिला है जैसे कि single.php

नोट चर हम रुचि रखते हैं है: global $wp_object_cache

निजी सदस्य $cacheवास्तविक कैशिंग डेटा रखता है।

प्रोग्रामिंग में, कैश संरचनाएं हर जगह हैं। एक सरल रूप में उन्हें एक महत्वपूर्ण मूल्य जोड़ी के रूप में पहचाना जा सकता है। बाल्टी, NoDB संरचनाएं, डेटाबेस अनुक्रमित। वर्डप्रेस ऑब्जेक्ट कैश अंतिम लक्ष्य सरलतम संभव संरचना नहीं था, लेकिन फिर भी प्रमुख मूल्य जोड़े को पहचाना जा सकता है।

चूँकि मैंने single.phpकैश छपवाया था:

print_r($wp_object_cache->cache['posts']);

मुझे एक ही पोस्ट कैश की जा रही है।

    [last_changed] => 0.34169600 1481802075
    [get_page_by_path:2516f01e446b6c125493ec7824b63868:0.34169600 1481802075] => 0
    [2831] => WP_Post Object
        (
            [ID] => 2831
            [post_author] => 1 
            ... the cached post object goes here
        )

ऑब्जेक्ट मान होगा, और कैशिंग कुंजी होगी

get_page_by_path:2516f01e446b6c125493ec7824b63868:0.34169600 1481802075

यहाँ आप $cache_keyसंरचना की जाँच कर सकते हैं :

File: /wp-includes/post.php
4210: /**
4211:  * Retrieves a page given its path.
4212:  *
4213:  * @since 2.1.0
4214:  *
4215:  * @global wpdb $wpdb WordPress database abstraction object.
4216:  *
4217:  * @param string       $page_path Page path.
4218:  * @param string       $output    Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to
4219:  *                                a WP_Post object, an associative array, or a numeric array, respectively. Default OBJECT.
4220:  * @param string|array $post_type Optional. Post type or array of post types. Default 'page'.
4221:  * @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
4222:  */
4223: function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {
4224:   global $wpdb;
4225: 
4226:   $last_changed = wp_cache_get_last_changed( 'posts' );
4227: 
4228:   $hash = md5( $page_path . serialize( $post_type ) );
4229:   $cache_key = "get_page_by_path:$hash:$last_changed";
4230:   $cached = wp_cache_get( $cache_key, 'posts' );
4231:   if ( false !== $cached ) {
4232:       // Special case: '0' is a bad `$page_path`.
4233:       if ( '0' === $cached || 0 === $cached ) {
4234:           return;
4235:       } else {
4236:           return get_post( $cached, $output );
4237:       }
4238:   }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.