Số lượng bộ nhớ bị rò rỉ WP_Query


10

Mỗi lần tôi gọi WP_Query () trong hàm bên dưới, Wordpress sẽ rò rỉ 8 megs bộ nhớ. Và vì tôi gọi hàm này rất nhiều, mọi thứ trở nên nhanh chóng ... :( Tôi đã thử bỏ đặt kết quả $ queryObject cũng như gọi định kỳ wp_cache_flush (), nhưng dường như không có tác dụng gì.

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 () là:

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
Bạn đã thử plugin DEBUG BAR chưa?
kaiser

có bao nhiêu bài viết được tìm nạp WP_Querynếu trường hợp của bạn (khi 8mb bị rò rỉ)?
Eugene Manuilov

Câu trả lời:


14

Phản hồi tuyệt vời về WP Hackers: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

Những gì bạn đang làm với truy vấn đó, đang tải MỌI bài đăng phù hợp vào bộ nhớ, bao gồm toàn bộ nội dung bài đăng. Như bạn có thể tưởng tượng, đây có lẽ là khá nhiều mặt hàng.

Bạn có thể chuyển 'các trường' => 'ids' vào WP_Query để chỉ cần trả về một danh sách các post_ids phù hợp thay vào đó, điều này sẽ làm giảm đáng kể bộ nhớ (và thời gian xử lý):

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


3

Tình cờ gặp phải điều này trong khi nghiên cứu vấn đề bộ nhớ được chỉ ra ở đây.

Trong trường hợp này, bạn có thể sử dụng get_the_id thay vì sử dụng bộ đệm để chụp id và bạn có thể thu hẹp các trường được truy vấn để chỉ bao gồm id.


Cảm ơn đã trả lời, Thomas! Tôi vừa mới viết một số SQL thô, như tôi nhớ. Tuy nhiên, điều này có lẽ cũng đã làm việc. Cám ơn rất nhiều! :)
rinogo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.