WP_Query स्मृति के बेतुका मात्रा में लीक


10

हर बार जब मैं नीचे फ़ंक्शन में WP_Query () कॉल करता हूं, तो Wordpress स्मृति के 8 megs को लीक करता है। और जब से मैं इस फ़ंक्शन को कॉल करता हूं, तो चीजें बहुत जल्दी बालों वाली हो जाती हैं ... :( मैंने परिणामी $ क्वेरी को परेशान करने की कोशिश की है और साथ ही समय-समय पर wp_cache_flush () कॉल कर रहा है, लेकिन न तो कोई प्रभाव पड़ता है? कोई विचार?

function get_post_ids_in_taxonomies($taxonomies, &$terms=array()) {
    $post_ids = array();

    $query = gen_query_get_posts_in_taxonomies($taxonomies, $terms);
    // var_dump($query);

    //Perform the query
    $queryObject = new WP_Query($query); //*****THE 8 MEGABYTES IS LEAKED HERE*****

    //For all posts found...
    if($queryObject->have_posts()) {
        while($queryObject->have_posts()) {
            $queryObject->the_post();

            //Get the $post_id by capturing the output of the_ID()
            ob_start();
            the_ID();
            $post_id = (int) ob_get_contents();
            ob_end_clean();

            // echo $post_id."\n";
            $post_ids[] = $post_id;
        }
    }

    unset($queryObject);

    return $post_ids;
}

gen_query_get_posts_in_taxonomies () है:

function gen_query_get_posts_in_taxonomies($taxonomies, &$terms=array()) {
    //General query params
    $query = array(
        'posts_per_page'    => -1,  //Get all posts (no paging)
        'tax_query'             => array('relation' => 'OR'),
    );

    //Add the specific taxonomies and terms onto $query['tax_query']
    foreach($taxonomies as $tax) {
        //Get terms in the taxonomies if we haven't yet
        if(!array_key_exists($tax, $terms)) {
            $terms[$tax] = array();

            $terms_tmp = get_terms($tax);
            foreach($terms_tmp as $tt)
                $terms[$tax][] = $tt->term_taxonomy_id;
        }

        $query['tax_query'][] = array(
            'taxonomy' => $tax,
            'terms' => $terms[$tax],
            'field' => 'term_taxonomy_id',
        );
    }

    return $query;
}

1
क्या आपने DEBUG BAR प्लगइन की कोशिश की है?
kaiser

WP_Queryयदि आपका मामला (जब 8mb लीक हुआ है) कितने पदों पर लाया जाता है?
यूजीन मनुइलोव

जवाबों:


14

WP हैकर्स पर उत्कृष्ट प्रतिक्रियाएं: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

आप उस क्वेरी के साथ क्या कर रहे हैं, पूरी पोस्ट सामग्री सहित मेमोरी में हर मेल पोस्ट लोड कर रहा है। जैसा कि आप कल्पना कर सकते हैं, यह संभवतः बहुत अधिक आइटम है।

आप WP_Query में 'फ़ील्ड' => 'ids' पास कर सकते हैं, इसके बजाय बस पोस्टिंग की मिलान सूची वापस करने के लिए, जिससे मेमोरी (और प्रोसेसिंग समय) में काफी कमी आनी चाहिए:

http://codex.wordpress.org/Class_Reference/WP_Query#Post_Field_Parameters


3

स्मृति अंक पर शोध करते हुए इस बात पर अड़ गए।

इस स्थिति में, आप आईडी पर कब्जा करने के लिए बफरिंग का उपयोग करने के बजाय get_the_id का उपयोग कर सकते हैं, और आप क्वेरिड फ़ील्ड को केवल आईडी शामिल करने के लिए संकीर्ण कर सकते हैं।


प्रतिक्रिया के लिए धन्यवाद, थॉमस! जैसा कि मुझे याद है, मैंने अभी कुछ कच्चे एसक्यूएल लिखना समाप्त किया है। हालाँकि, यह शायद काम भी किया होगा। बहुत बहुत धन्यवाद! :)
rinogo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.