WP_Query จำนวนหน่วยความจำที่ไม่มีสาระรั่วไหล


10

ทุกครั้งที่ฉันเรียก WP_Query () ในฟังก์ชั่นด้านล่าง Wordpress มีหน่วยความจำรั่ว 8 เมกะไบต์ และเนื่องจากฉันเรียกฟังก์ชั่นนี้มากมายสิ่งต่าง ๆ ขนดกค่อนข้างเร็ว ... :( ฉันได้ลองตั้งค่า $ queryObject ที่เกิดขึ้นแล้วเช่นเดียวกับการเรียก 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 แล้วหรือยัง
ไกเซอร์

มีการโพสต์จำนวนเท่าใดWP_Queryหากกรณีของคุณ (เมื่อ 8mb ถูกรั่วไหล)
Eugene Manuilov

คำตอบ:


14

คำตอบที่ยอดเยี่ยมเกี่ยวกับ WP แฮ็กเกอร์: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

สิ่งที่คุณกำลังทำกับแบบสอบถามนั้นกำลังโหลดโพสต์ที่ตรงกันทุกหน่วยความจำรวมถึงเนื้อหาโพสต์แบบเต็ม อย่างที่คุณสามารถจินตนาการได้นี่อาจเป็นสิ่งของจำนวนมาก

คุณสามารถส่ง 'fields' => 'ids' ลงใน WP_Query เพื่อเพียงแค่ส่งคืนรายการ post_ids ที่ตรงกันแทนซึ่งควรลดหน่วยความจำ (และเวลาในการประมวลผล) อย่างมีนัยสำคัญ:

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


3

สะดุดกับสิ่งนี้ในขณะที่การวิจัยปัญหาหน่วยความจำชี้ให้เห็นที่นี่

ในกรณีนี้คุณสามารถใช้ get_the_id แทนการใช้การบัฟเฟอร์เพื่อจับภาพ id และคุณสามารถ จำกัด เขตข้อมูลที่สอบถามเพื่อ จำกัด รหัสเท่านั้น


ขอบคุณสำหรับคำตอบโทมัส! ฉันเพิ่งจบการเขียน SQL ดิบตามที่ฉันจำได้ อย่างไรก็ตามนี่อาจจะใช้ได้เช่นกัน ขอบคุณมาก! :)
rinogo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.