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가 유출 된 경우) 에 얼마나 많은 게시물을 가져 옵니까?
유진 마누엘 로프

답변:


14

WP 해커에 대한 탁월한 답변 : http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

해당 쿼리로 수행하는 작업은 전체 게시물 내용을 포함하여 일치하는 모든 게시물을 메모리에로드하는 것입니다. 당신이 상상할 수 있듯이, 이것은 아마도 꽤 많은 항목 일 것입니다.

'fields'=> 'ids'를 WP_Query에 전달하여 대신 일치하는 post_id 목록을 반환하면 메모리 (및 처리 시간)가 크게 줄어 듭니다.

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


3

여기에 지적 된 메모리 문제를 조사하는 동안이 문제가 발생했습니다.

이 경우 버퍼링 대신 get_the_id를 사용하여 ID를 캡처 할 수 있으며 쿼리 된 필드의 범위를 좁혀서 ID 만 포함 할 수 있습니다.


답변 주셔서 감사합니다, 토마스! 방금 기억 나는 것처럼 원시 SQL을 작성했습니다. 그러나 이것은 아마도 효과가 있었을 것입니다. 정말 고마워! :)
rinogo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.