लाखों पोस्ट के लिए WP साइट का अनुकूलन कैसे करें


19

मैं एक कंपनी के लिए एक वेबसाइट पर काम कर रहा हूं जो कि कस्टम पोस्ट प्रकार के माध्यम से लाखों पोस्ट बनाने की संभावना होगी। वे प्रार्थना कर रहे हैं, इसलिए मूल रूप से सामने के छोर पर स्थित उपयोगकर्ता एक फ़ॉर्म के माध्यम से एक संक्षिप्त वाक्यांश प्रस्तुत करता है। सभी कंपनी के बारे में परवाह है पोस्ट सामग्री और पोस्ट की तारीख है। साइट अभी तक लॉन्च नहीं हुई है और उनके पास पहले से ही 120,000 से अधिक पोस्ट हैं, इसलिए जब मैं लाखों कहता हूं तो मैं गंभीर रूप से मर जाता हूं।

इसलिए, कुछ अनुकूलन प्रश्न:

  1. मान लीजिए कि मेरे पास कस्टम पोस्ट प्रकार में एक श्रेणी 'चित्रित' है जिसमें 500,000 पोस्ट हैं। चित्रित श्रेणी में केवल 500 पद हैं। यदि मैं विशेष रुप से प्रदर्शित पदों के लिए एक प्रश्न बनाता हूं, तो क्या मैं पूरे 500,000 पदों या सिर्फ 500 विशेषताओं को उद्धृत कर रहा हूं? क्या होगा यदि मैं केवल दस सबसे हाल के पोस्ट प्रदर्शित करना चाहता हूं जो चित्रित किए गए हैं?
  2. इस कस्टम पोस्ट प्रकार को डेटाबेस में सहेजते समय सर्वर संसाधनों पर कटौती करने के लिए मैं कोई भी चीज कर सकता हूं, खासकर जब से केवल आवश्यक चीज पोस्ट और तारीख की सामग्री है?
  3. क्या मुझे भी कस्टम पोस्ट प्रकार का उपयोग करना चाहिए? मुझे यह सिद्धांत में पसंद है क्योंकि यह वर्डप्रेस व्यवस्थापक में अच्छी तरह से एकीकृत है, लेकिन अगर प्रदर्शन में महत्वपूर्ण नुकसान हैं तो मुझे लगता है कि मैं कुछ अलग कर सकता हूं।

मैंने कभी इस पैमाने पर एक परियोजना पर काम नहीं किया है, इसलिए मैं सामान्य से प्रदर्शन के बारे में थोड़ा अधिक चिंतित हूं। किसी भी मदद के लिए धन्यवाद!


अपने वर्डप्रेस फ़ंक्शंस में डेटाबेस क्वेरीज़ को न्यूनतम रखना और लिपियों को उचित रूप से कॉल करना महत्वपूर्ण है, लेकिन अनुकूलन का एक बड़ा हिस्सा सर्वर को कैसे सेट और कॉन्फ़िगर किया गया है, इसके साथ करना है। उसके लिए, सर्वर फॉल्ट नेटवर्क खोजें। serverfault.com/search?q=optimize+wordpress
iyrin

@RyanLoremIpsum - टिप्पणी के लिए धन्यवाद, लेकिन मैं अपने विशिष्ट प्रश्नों के उत्तर की उम्मीद कर रहा था। मुझे जो कुछ भी मिला, उसमें से अधिकांश सर्वर के साथ ही काम करता है, न कि कैसे वर्डप्रेस संचालित होता है और एक कोड परिप्रेक्ष्य से इसे कैसे अनुकूलित किया जाए
जेरेमिया प्रिमर

जवाबों:


26

1. WP_Query चलाने से पहले क्वेरी सेट करें

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

सामान्य क्वेरी
सामान्य क्वेरी के लिए, वर्डप्रेस wp()फ़ंक्शन का उपयोग करता है , जो बदले में कॉल करता है $wp->main( $query_vars )। सशर्त टैग से "is_ वैरिएबल" उन्हें पास करने से पहले सेट किया जाता है WP_Query->get_posts(), जो इसे MySQL डेटाबेस क्वेरी में परिवर्तित करता है और अंत में उन्हें $ wp_query ऑब्जेक्ट में संग्रहीत करता है। SQL डेटाबेस में वास्तव में चलाने से पहले क्वेरी को फ़िल्टर करना संभव है ।

pre_get_postsकार्रवाई इस प्रक्रिया में हुक, इससे पहले कि यह करने के लिए पारित हो जाता है तो आप क्वेरी को परिवर्तित करने के लिए अनुमति WP_Query->get_posts()

उदाहरण के लिए, यदि आप "विशेष रुप से" श्रेणी में पदों के लिए क्वेरी को फ़िल्टर करना चाहते हैं, तो आप सशर्त टैग का उपयोग add_action( 'pre_get_posts', 'your_function_name' );और शामिल करेंगे ।in_categoryyour_function_name

function your_function_name( $query ) {
    if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
        // Replace 123 with the category ID of the featured category.
        $query->set( 'cat', '123' );
    }
}
add_action( 'pre_get_posts', 'your_function_name' );

देखें प्लग इन API / कार्रवाई संदर्भ / पदों «वर्डप्रेस कोडेक्स प्राप्त पूर्व

पृष्ठ अनुरोध
पृष्ठ टेम्पलेट के लिए, जैसे "चित्रित" श्रेणी के लिए संग्रह पृष्ठ, सशर्त टैग pre_get_postsफ़िल्टर से काम नहीं करेंगे । उदाहरण के लिए, आप is_categoryसंग्रह पृष्ठ की जांच करने के लिए उपयोग नहीं कर सकते क्योंकि WP_Query नहीं चला है।

इसके बजाय, आपको पृष्ठ अनुरोधों के लिए मुख्य क्वेरी को बदलना new WP_Queryहोगा जिसके साथ कुछ ऐसा दिखेगा $query = new WP_Query( 'cat=123' );। यह क्वेरी को शुरू से ही उपयुक्त तर्क के साथ चलाता है।

देखें क्लास संदर्भ / WP क्वेरी «वर्डप्रेस कोडेक्स

2. डेटाबेस के लिए बचत

आप यह wp_insert_post_dataसुनिश्चित करने के लिए फ़िल्टर का उपयोग कर सकते हैं कि आपके कस्टम पोस्ट प्रकार के लिए प्रासंगिक केवल $ डेटा वापस कर दिया जाए wp_insert_post। अपने कस्टम पोस्ट प्रकार की जांच के लिए एक सशर्त विवरण शामिल करना सुनिश्चित करें।
प्लगइन एपीआई / फ़िल्टर संदर्भ / wp डालने पोस्ट डेटा «वर्डप्रेस कोडेक्स

इस हुक को wp_insert_postफ़ंक्शन द्वारा कहा जाता है , जिसे wp_update_post द्वारा कॉल किया जाता है जब आप अपने कस्टम पोस्ट प्रकार को अपडेट करते हैं, आमतौर पर एक ड्राफ्ट को सहेजकर या पोस्ट प्रकाशित करके।

आपको इसे स्वयं बेंचमार्क करना होगा यद्यपि मैं व्यक्तिगत रूप से डेटाबेस में अपडेट किए गए डेटा को कम करने के अनुकूलन महत्व के रूप में नहीं बोल सकता हूं।

3. क्या कस्टम पोस्ट प्रकार प्रदर्शन को प्रभावित करते हैं?

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

पर्मलिंक संरचना से संबंधित एक प्रदर्शन मुद्दा हुआ करता था, जिससे यह एक संख्या के बजाय पाठ से शुरू होने पर हिट हो जाता था। 3 यह बड़ी संख्या में पृष्ठों की मेजबानी करने वाली साइटों के लिए विशेष रूप से परेशानी थी, लेकिन वर्डप्रेस संस्करण 3.3 के बाद से हल किया गया है।

मैं केवल यहां पेर्मलिंक ला रहा हूं क्योंकि स्लग आमतौर पर पर्मलिंक संरचना का पहला हिस्सा है जो कि संस्करण 3.3 से पहले प्रदर्शन को प्रभावित कर सकता है या नहीं भी कर सकता है। इसके अलावा मुझे किसी भी प्रकार के प्रदर्शन के मुद्दों की जानकारी नहीं है, जो कस्टम पोस्ट प्रकारों के उपयोग से उत्पन्न होते हैं।

अन्य प्रदर्शन विकल्प

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

<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
    $pttimestamp = time() + get_option('gmt_offset') * 60*60;
    $its_query = new WP_Query( array(
        'post_type' => 'spotlight',
        'posts_per_page' => 1,
            'post__not_in' => $do_not_duplicate,
        'meta_query' => array(
            array(
                'key' => '_hpc_spotlight_end_time',
                'value' => $pttimestamp,
                'compare' => '>'
            )
        )
    ) );
    set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
    // LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>

अधिक क्वेरी अनुकूलन
थॉमस ग्रिफिन अपने ऑप्टिमाइज़ वर्डप्रेस क्वेरीज़ ट्यूटोरियल में कुछ अच्छे सुझाव हैं । यहां उनके सुझावों की एक संक्षिप्त सूची दी गई है:

  • 'cache_results' => falseयदि आपका सर्वर मेम्नेच्ड जैसे लगातार कैशिंग का उपयोग नहीं कर रहा है तो एकबारगी प्रश्नों में सेट करें । एक-बंद प्रश्नों को "प्रश्नों के रूप में वर्णित किया जाता है जो कि छोटी मात्रा में डेटा दिखाने के लिए उपयोग किए जाते हैं। यह हो सकता है कि आप वर्तमान पोस्ट से संबंधित लिंक किए गए पोस्ट शीर्षक प्रदर्शित करना चाहते हैं, या आप का चयन करने के लिए पोस्ट की एक ड्रॉपडाउन प्रदर्शित करना चाह सकते हैं। एक विशेष विकल्प सेटिंग। "

    उसका उदाहरण: $query = get_posts( array( 'posts_per_page' => 1, 'cache_results' => false ) );

  • सेट करें 'no_found_rows' => trueजहाँ पेजिंग की आवश्यकता नहीं है। यह "MySQL के परिणामों की गणना करके यह देखेगा कि हमें अंकुरण की आवश्यकता है या नहीं।"

    उसका उदाहरण: $query = new WP_Query( array( 'posts_per_page' => 1, 'no_found_rows' => true ) );

  • पोस्ट आईडी के लिए क्वेरी केवल अगर यह आप सभी की जरूरत 'fields' => 'ids' है get_posts। यह महत्वपूर्ण रूप से वापस किए जा रहे डेटा की मात्रा को कम करना चाहिए, जो कि डेटाबेस विवरण «वर्डप्रेस कोडेक्स को देखने पर प्रति पोस्ट बहुत अधिक है

    उसका उदाहरण: $query = get_posts( array( 'posts_per_page' => 1, 'fields' => 'ids' ) );

उस अंतिम टिप के अलावा, एक ही तर्क तब लागू किया जा सकता है जब आपको get_post_field का उपयोग करके केवल एक या कुछ पोस्ट फ़ील्ड की आवश्यकता होती है

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


2
उत्कृष्ट और अत्यंत उपयोगी उत्तर, धन्यवाद!
यिर्मयाह प्रुमर

विषय पूरी तरह से कस्टम निर्मित है, इसलिए हम वास्तव में केवल बिल्कुल आवश्यक वस्तुओं की क्वेरी कर रहे हैं। हालांकि ये बेहद मददगार हैं। यह देखते हुए कि मैं वापस जा रहा हूं और अपने प्रश्नों में कुछ बदलाव करूंगा। ;)
जेरेमिया प्रमर

1
मुझे लगता है कि आप जहाँ भी संभव हो मेटा सवालों से बचना चाहिए woiuld जोड़ें निश्चित रूप से एक साथ दो मेटा फ़ील्ड के विरुद्ध क्वेरी न चलाएं। इसके परिणामस्वरूप दोहरे और तिहरे प्रश्न होते हैं जो जल्दी ही एक प्रदर्शन निगार बन जाते हैं। कस्टम पोस्ट प्रकार अक्सर इसके साथ मदद कर सकते हैं।
चार्ल्स Jaimet

3

मैं भी जोड़ता हूं:

    'no_found_rows'          => true,
    'update_post_term_cache' => false,
    'update_post_meta_cache' => false,
    'cache_results'          => false
  • no_found_rows (बूलियन) - इसे तब सच करें जब आपको किसी भी पेजिनेशन की आवश्यकता न हो और कुल मिले पदों की संख्या की आवश्यकता न हो।
  • cache_results (बूलियन) - पोस्ट जानकारी कैश।
  • update_post_meta_cache (बूलियन) - पोस्ट मेटा जानकारी कैश।
  • update_post_term_cache (बूलियन) - पोस्ट शब्द सूचना कैश।

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

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

कृपया देखें: https://drujoopress.wordpress.com/2013/06/27/how-to-optimize-wordpress-query-to-get-results-faster/#more-184


1
कृपया संपादित आपका जवाब है, और एक विवरण जोड़ें: क्यों कि समस्या का समाधान कर सकता है?
FUXIA

मैं इस जवाब पर अपनी टिप्पणी नहीं जोड़ सकता: wordpress.stackexchange.com/a/166699/57674
rigosan

1

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

सामान्य तौर पर, प्रति MYSQL चश्मा डेटा की मात्रा के साथ कोई समस्या नहीं होनी चाहिए। बेशक सर्वश्रेष्ठ एल्गोरिदम के साथ भी डेटा की खोज धीमी हो जाएगी, फिर बहुत छोटी तालिकाओं के साथ लेकिन इसका समाधान सरल, मजबूत सीपीयू है।

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

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