get_option () बनाम get_theme_mod (): एक धीमा क्यों है?


17

मैं get_theme_mod()कुछ समय के लिए विभिन्न परियोजनाओं में उपयोग कर रहा हूं । मैंने वर्डप्रेस v3.4 में थीम कस्टमाइज़ेशन एपीआई का लाभ उठाने का फैसला किया, क्योंकि यह उपलब्ध होने के बाद मुझे लगा कि यह मेरे ग्राहकों के लिए उपयोग करने के लिए एक अनिवार्य उपकरण है।

कुछ समय बाद, मैंने नोटिस करना शुरू किया कि मेरी साइटें सामान्य से थोड़ी अधिक सुस्त महसूस कर रही थीं, और विशेष रूप से कस्टमाइज़र को लोड करने में काफी लंबा समय लगा। मेरी जांच के दौरान परीक्षण और त्रुटि के बहुत सारे के माध्यम से, मैं बाहर जाने की कोशिश करें का फैसला किया typeजब मेरी सेटिंग्स (यानी पंजीकरण के $wp_customize->add_setting()से) theme_modकरने के लिए option

एक बार जब मैंने ऐसा किया और मेरे सभी get_theme_mod()कॉल को स्वैप कर दिया get_option(), तो मैंने पहले वाले फ्रंट के विपरीत और विशेष रूप से बैकएंड पर कस्टमाइज़र के विपरीत बाद वाले सेटअप का उपयोग करते हुए गति में बहुत महत्वपूर्ण वृद्धि देखी । मैं वर्डप्रेस कोर के माध्यम से देख रहा हूं कि यह क्यों है, इसके लिए एक उत्तर का पता लगाने की कोशिश कर रहा हूं, लेकिन इस परिदृश्य में विशेष रूप से हैंगअप क्या है, यह समझ नहीं आ रहा है।

किसी भी अंतर्दृष्टि कि समुदाय के संबंध में get_option()काफी तेजी से प्रदर्शन की तुलना में get_theme_mod()बहुत सराहना की जाएगी हो सकता है।


1
आप में एक बार देख ले तो /wp-includesपर option.phpजहां get_option()परिभाषित किया गया है, और कम से theme.phpजहां get_theme_mod()परिभाषित किया गया है, तो आप कि बाद वास्तव में कॉल देख सकते हैं get_option(), जो अपने आप में यह का एक विस्तार भी है कि किसी भी आवश्यक फिल्टर लागू होता है के रूप में कार्य। समझा सकता है कि यह धीमा क्यों है।
जोड़ी हैडर जूल

1
जोडी, मैंने सोचा कि खुद को, लेकिन ऐसा लगता है कि बस संदर्भित get_option()करने और कुछ फिल्टर लगाने से इसे धीमा नहीं करना चाहिए जितना कि यह था। निश्चित रूप से एक शानदार शुरुआती बिंदु, लेकिन मैं सोच रहा हूं कि क्या यहां के कामों में कुछ और नहीं है।
ntg2

3
वहाँ किसी भी प्रकार के गति अंतर के लिए कोई कारण नहीं है, इसलिए मुझे संदेह है कि कुछ और आपके कथित मतभेद पैदा कर रहा है। थीम मॉड को विकल्प के रूप में संग्रहीत किया जाता है।
ओटो

अलग-अलग मॉड लाने में क्रमांकन / अनविज्ञानीकरण प्रक्रिया किसी तरह से इसमें हिस्सा ले सकती है? मुझे लगता है कि अगर अतिरिक्त काम करने के लिए mod निकालने के लिए एक हैंगअप हो सकता है, तो मुझे ऐसा करने की आवश्यकता के बिना केवल विकल्प लाने के लिए उत्सुक होना चाहिए। जब करने से परिवर्तन get_theme_mod()करने के लिए get_option()सभी परियोजनाओं की गति दोनों दृश्यपटल पर और कस्टमाइज़र में औसतन दोगुनी हो गई। यह एकमात्र परिवर्तन था जो इसे किसी भी अन्य दुष्प्रभावों से अलग करने के प्रयास में किया गया था।
ntg2

जवाबों:


19

इसका उत्तर है कि हां, theme_mod फ़ंक्शंस धीमे होंगे, लेकिन महत्वपूर्ण रूप से नहीं, और लाभ मतभेदों को दूर करते हैं।

थीम मॉड को विकल्प के रूप में संग्रहीत किया जाता है। तो, संक्षेप में, theme_mod फ़ंक्शन विकल्प फ़ंक्शन के आसपास रैपर हैं।

सबसे पहले, यह समझें कि theme_mod सेटिंग्स को एक ही विकल्प में एक सरणी के रूप में संग्रहीत किया जाता है, जिसे विशिष्ट थीम नाम के लिए रखा गया है। तो, अगर मैं ऐसा करता हूं:

set_theme_mod('aaa',123);
set_theme_mod('bbb',456);

फिर डेटाबेस में मुझे वास्तव में जो मिलता है वह एक एकल विकल्प पंक्ति है जिसमें theme_mods_themename का नाम है जिसमें ('आआ' => 123, 'bbb' => 456) के साथ क्रमबद्ध सरणी है।

अब, get_theme_modधीमी हो जाएगी क्योंकि यह वास्तव में दो get_optionकॉल कर रहा है। सबसे पहले, यह विषय का नाम हो जाता है। फिर, यह theme_mods_themenameविकल्प हो जाता है । तो वहीं, 50% स्पीड लॉस है। किए गए बाकी काम ज्यादातर फ़िल्टर में निहित हैं, इसमें एक अतिरिक्त फ़िल्टर कॉल है, लेकिन जब तक आपके पास उस फ़िल्टर पर कुछ नहीं होता है, यह थोड़े महत्वहीन है।

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

यह set_theme_modकुछ हद तक धीमा होगा क्योंकि यह उन्हीं दो विकल्पों को कॉल करता है, फिर यह get_optionथीम नाम को फिर से प्राप्त करने के लिए एक और कॉल करता है, और फिर यह update_optionअब बदले हुए विकल्पों के पूर्ण सेट के साथ करता है । यह एक डेटाबेस अपडेट का कारण बनता है, और यह तथ्य कि यह बहुत अधिक डेटा भेज रहा है वास्तव में एक ध्यान देने योग्य मंदी का कारण हो सकता है। कुछ बाइट्स को अपडेट करना एक बड़ी पंक्ति को अपडेट करने की तुलना में तेज है। लेकिन इतना नहीं जितना आप देखेंगे, आमतौर पर। जब तक कि आपके पास बहुत सारी सेटिंग्स नहीं हैं ...

थीम मॉड फ़ंक्शंस संभवतः समग्र रूप से अनुकूलन के कारण होते हैं, निश्चित रूप से, लेकिन फिर भी आपको get_option के बजाय उनका उपयोग करना चाहिए और जैसे कि बच्चे थीम।

सीधे विकल्प पंक्तियों का उपयोग करने के साथ समस्या यह है कि आप उन्हें सीधे उपयोग कर रहे हैं और अपनी सेटिंग्स के लिए विशिष्ट कुंजी नामों का उपयोग कर रहे हैं।

यदि मेरे पास "एएए" नामक एक विषय है और मैं इसे किसी अन्य साइट पर उपयोग करने के लिए "बीबीबी" नामक एक बच्चे का विषय बनाता हूं, तो मेरी "एएए" थीम "उदाहरण" नामक विकल्प का उपयोग कर सकती है। जब मैं एक साइट को अपडेट करता हूं, और यह मेरे विकल्प को अपडेट करता है, तो वही विकल्प अब मेरे बच्चे के विषय पर लागू होगा। अगर मैं ऐसा नहीं करना चाहता था तो क्या होगा? क्या होगा यदि मैं विकल्प सेटिंग के एक अलग सेट का उपयोग करने के लिए चाइल्ड थीम चाहता था?

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

और अगर कुछ भविष्य के कोर परिवर्तन या प्लगइन संशोधित करते हैं कि कैसे theme_mods काम करता है, तो आप बिना किसी परिवर्तन के स्वचालित रूप से उस का लाभ प्राप्त करेंगे। रैपर हमेशा धीमे रहने वाले होते हैं, यह अपरिहार्य है, यह रैपर की प्रकृति है। फिर भी, आप अभी भी PHP कोड लिख रहे हैं, मशीन भाषा नहीं। हम चीजों को सरल बनाने और कार्यक्षमता को अलग करने के लिए इस तरह के रैपर का उपयोग करते हैं। थीम्स को यह जानने, या देखभाल करने की आवश्यकता नहीं होनी चाहिए कि डेटाबेस में उनके विकल्प कैसे संग्रहीत हैं, या नामकरण कैसे काम करता है। Theme_mod फ़ंक्शन एक सरल समाधान प्रदान करता है जो क्लीनर है।


3

get_theme_modचारों ओर सिर्फ एक आवरण है get_option। सिद्धांत रूप में क्योंकि यह अमूर्तता की एक और परत है, यह धीमी गति से काम करेगी लेकिन व्यवहार में यह अंतर इतना बड़ा नहीं होना चाहिए कि किसी मनुष्य द्वारा देखा जा सके।

वास्तविक गति अंतर हो सकता है यदि आपके पास theme_mod हुक पर कुछ धीमा कोड है।


1

वहाँ तो Customizer में कुछ हो सकता है? मैं यहाँ ओपी जैसी ही चीज़ देख रहा हूँ।

मैं इस बात की पुष्टि कर सकता हूं कि लगभग 30 विकल्पों के साथ मेरा कस्टमाइज़र लोड समय लगभग 3s से घटकर लगभग .5 s पर आ गया जब स्विचिंग get_optionखत्म हो गईget_theme_mod

सीधे तरीकों को कॉल करने पर मुझे 2ms का अंतर दिखाई देता है।

परीक्षण के परिणाम ( https://gist.github.com/anonymous/d98a46d00d52d40e7dec )

जब आप सीधे एपीआई की तुलना करते हैं तो यह ध्यान देने योग्य नहीं हो सकता है, लेकिन कस्टमाइज़र में उनका उपयोग कैसे किया जाता है, इसके साथ कुछ होना चाहिए।


1

आप कर सकते हैं परीक्षण की get_option(100 पुनरावृत्तियों) इस कोड (में डाल का उपयोग कर functions.phpया कहीं):

add_action('wp','My_Test');
function My_Test(){
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_option('blogdescription'); }
    var_dump(microtime(true));
    for ($i=1; $i<100; $i++) { get_theme_mod('blogdescription'); }
    var_dump(microtime(true));
    exit;
}   




एक और विचार

मुझे नहीं पता, अगर इससे कोई फ़र्क पड़ता है (हो सकता है कि Wordpress डेवलपर्स इसे बेहतर जानते हों), लेकिन मैंने सोचा, कि अगर किसी वेबसाइट पर हाई ट्रैफ़िक है, और हर पेज लोड होने पर, उसे सौ विकल्प प्राप्त करने होंगे, तो क्या होगा एक में कई विकल्प get_option? इस तरह:

update_option('my_extra_optss',  array(
      'myNAME' => 'George',
      'myAGE'  => 43 ));

फिर :

$x = get_option('my_extra_optss');
$x['myNAME'];
$x['myAGE'];
................

क्या यह साइट को थोड़ा तेज़ करेगा?


2
ठीक यही पहले से ही मिलता है। सभी विषय मोड पहले से ही एक विकल्प में शामिल हो गए हैं। जब भी आप get_theme_mod कॉल करते हैं तो यह पहली बार दो डेटाबेस कॉल करता है, और बाद में शून्य डेटाबेस कॉल करता है।
ओटो

0

TL; DR: यदि आप एक थीम डेवलपर हैं, तो आपको get_theme_mod का उपयोग करना चाहिए

पूर्ण उत्तर:

यदि आपके पास 100 get_option कॉल हैं, तो यह आपके डेटाबेस में 100 प्रश्न लेता है।

यदि आपके पास 100 get_theme_mod कॉल हैं, तो यह आपके डेटाबेस में केवल 1 क्वेरी लेता है।

क्यों? चूँकि सभी थीम मोड एक ही डेटाबेस पंक्ति में संग्रहित किए जाते हैं और इन्हें केवल एक ही कहा जाएगा, जबकि प्रत्येक विकल्प एक पंक्ति है और 100 get_option कॉल के परिणामस्वरूप 100 डेटाबेस प्रश्न होंगे और निश्चित रूप से, यह आपकी साइट को धीमा कर देता है।

यदि आपकी थीम में बहुत सारे विकल्प हैं, तो get_theme_mod का उपयोग करने से डेटाबेस में आपकी क्वेरी संख्या काफी कम हो जाएगी।

आप क्वेरी मॉनिटर प्लगिन द्वारा प्रदर्शन और प्रश्नों की संख्या की जांच कर सकते हैं

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