हर जगह वस्तु कैश
वर्डप्रेस यथासंभव डेटाबेस प्रश्नों की संख्या को कम करने की कोशिश करता है।
उदाहरण के लिए, कभी-कभी आपको मेटा फ़ील्ड या टैक्सोनॉमी फ़ील्ड प्राप्त होता है, डेटाबेस को क्वेरी करने से पहले, वर्डप्रेस दिखता है कि क्या पहले से ही कैश में संग्रहीत और संग्रहीत किया गया था, और डेटाबेस को क्वेरी करने के बजाय इसे वहाँ से लौटाता है।
"कैश जॉब" WP_Object_Cacheक्लास और wp_cache_*फ़ंक्शंस के माध्यम से किया जाता है (जो कि क्लास के तरीकों के लिए आवरण है।)
जहां कैश रहता है
डिफ़ॉल्ट रूप से, "कैश" PHP वैश्विक चर से अधिक कुछ नहीं है। इसका मतलब है कि यह स्मृति में है, लेकिन इसका मतलब यह भी है कि यह हर अनुरोध पर गायब हो जाता है।
हालांकि, ड्रॉपिन्स ( advanced-cache.phpऔर / या object-cache.php) के माध्यम से, इस कैश को संभालने के लिए कस्टम तरीके से सेटअप करना संभव है।
आमतौर पर, इस ड्रॉपइन का उपयोग किसी प्रकार के कैशिंग तंत्र को सेट करने के लिए किया जाता है जो एकवचन अनुरोधों को "जीवित" करता है।
इस कारण से, WP के लोगों के बीच, इन्हें "लगातार कैश" प्लगइन्स के रूप में जाना जाता है (भले ही बुलबुले के बाहर शब्द "कैश" और "लगातार" एक साथ बहुत अर्थ नहीं बनाते हैं)।
आजकल लोकप्रिय विकल्प मेमकेच्ड या रेडिस हैं ।
इसलिए "लगातार कैश" प्लगइन्स का उपयोग करके आप डेटाबेस प्रश्नों की संख्या को काफी कम कर सकते हैं, क्योंकि कैश हर अनुरोध पर अपडेट नहीं किया जाता है।
कुछ उदाहरण
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
ऊपर दिए गए कोड की 2 लाइनें, अधिकतम 1 डेटाबेस क्वेरी को ट्रिगर करेंगी।
वास्तव में, जब आप एक कस्टम फ़ील्ड को क्वेरी करते हैं, तो उस पोस्ट के सभी फ़ील्ड डेटाबेस से पुनर्प्राप्त किए जाते हैं, ऑब्जेक्ट कैश के माध्यम से कैश किए जाते हैं, और बाद के अनुरोध कैश से डेटा खींचते हैं और डीबी से नहीं।
टैक्सोनॉमी शर्तों के लिए भी ऐसा ही होता है, वर्डप्रेस सभी शर्तों को एक बार टैक्सोनॉमी के लिए खींचता है, फिर उन्हें कैश से लौटाता है।
WordPress में Object cache का बहुत व्यापक रूप से उपयोग किया जाता है। न केवल पदों, मेटा वैल्यूज़ और टैक्सोनॉमी के लिए, बल्कि उपयोगकर्ताओं, टिप्पणियों, थीम डेटा के लिए भी ...
WP_Queryइन सबका क्या करना है?
जब आप कुछ पोस्ट को WP_Queryडिफ़ॉल्ट रूप से क्वेरी करते हैं , तो वर्डप्रेस न केवल उन्हें डेटाबेस से (या कैश से अगर वे कैश किए जाते हैं) खींचते हैं, बल्कि सभी कस्टम फ़ील्ड और खींची गई पोस्ट से संबंधित सभी टैक्सोनॉमियों के लिए कैश को अपडेट करते हैं ।
इसलिए जब आप कॉल करते हैं, उदाहरण के लिए, get_the_terms()या get_post_meta()जब लूपिंग पोस्ट के माध्यम से मिला WP_Query, तो आप वास्तव में किसी डेटाबेस क्वेरी को ट्रिगर नहीं करते हैं, लेकिन कैश से जानकारी खींचते हैं।
अच्छा है, यह नहीं है?
ठीक है, हाँ, लेकिन यह एक लागत के साथ आता है।
कैश अद्यतन "जादू" वर्डप्रेस करता है कि जब पुल पदों के माध्यम से WP_Queryमें होने update_meta_cacheमेटा के लिए और में update_object_term_cachetaxonomies के लिए।
यदि आप उन फ़ंक्शन के स्रोत कोड को देखते हैं, तो आप देखेंगे कि वर्डप्रेस प्रत्येक फ़ंक्शन में केवल एक डीबी क्वेरी करता है, लेकिन बहुत सारे प्रसंस्करण भी करता है। उदाहरण के लिए, update_object_term_cacheवहाँ 7 नेस्टेड हैंforeach ... यदि आपके पास बहुत सारे टैक्सोनॉमी हैं, और प्रति पृष्ठ पदों की संख्या अधिक है, तो यह बहुत अच्छा नहीं है।
उन WP_Queryतर्कों के बारे में , आखिरकार
कस्टम फ़ील्ड और टैक्सोनॉमी के लिए क्रमशः कैश को अपडेट करने के लिए वर्डप्रेस को रोकने के लिए क्या 'update_post_meta_cache'और 'update_post_term_cache'कब सेट करना falseहै।
उस स्थिति में, पहली बार किसी कस्टम फ़ील्ड या टैक्सोनॉमी को क्वेर किया जाता है, जिससे डेटाबेस क्वेरी ट्रिगर होती है, और डेटा कैश किया जाता है।
यह मुसीबत के लायक है?
हमेशा की तरह, जवाब यह निर्भर करता है । उन मानों को सेट करने के लिए अधिकांश समय false, एक अच्छा विकल्प है, क्योंकि यह अनावश्यक प्रसंस्करण और डेटाबेस प्रश्नों को रोकता है यदि आवश्यक नहीं है, और कैश वैसे भी अपडेट किया जाता है, जब पहली बार कस्टम क्षेत्र / वर्गीकरण की शर्तों की आवश्यकता होती है।
हालाँकि, यदि आप get_post_meta()लूप के दौरान एक बार भी कॉल करने जा रहे हैं, और आप get_the_terms()पोस्ट द्वारा समर्थित टैक्सोनोमी के सभी (या अधिकांश) के लिए कॉल करने जा रहे हैं , तो कैश अपडेट वैसे भी चालू हो जाता है, और इस पर कोई वास्तविक लाभ नहीं हो सकता है उन क्वेरी तर्क को सेट करना false।
wp_reset_postdata()को रीसेटglobal $postऔर रीसेट करने का कारण है ? ऐसा लगता है कि अगर मैंने एक कस्टम WP_Query किया, तो यह एक नई कैश्ड वस्तु का निर्माण करेगा, लेकिन इसे रीसेट करने पर मूल कैश प्राप्त करने के लिए भी आवश्यकता होगी। या शायद मैं इस सवाल के संदर्भ में बहुत दूर हो रहा हूं।