WP_QUERY泄漏的内存量高得离谱

时间:2012-06-01 作者:rinogo

每次我在下面的函数中调用WP\\u Query(),Wordpress都会泄漏8兆内存。因为我经常调用这个函数,所以事情很快就变得复杂了…:(我尝试过取消生成的$queryObject的设置,并定期调用wp\\u cache\\u 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\\u query\\u get\\u posts\\u in\\u 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;
}

3 个回复
最合适的回答,由SO网友:rinogo 整理而成

对WP黑客的出色响应:http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

您对该查询所做的是将每个匹配的帖子加载到内存中,包括完整的帖子内容。可以想象,这可能是相当多的项目。

您可以将“fields”=>“ids”传递到WP\\u查询中,只需返回匹配的post\\u id列表即可,这将显著减少内存(和处理时间):

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

SO网友:Thomas

在研究这里指出的记忆问题时偶然发现了这一点。

在这种情况下,可以使用get\\u the\\u id而不是使用缓冲来捕获id,并且可以缩小查询字段的范围,使其仅包含id。

SO网友:Moiceanu Marius

使用wp_suspend_cache_addition( true ); 在脚本开始时,我解决了这个问题。

结束

相关推荐

High CPU & Memory Spikes?

我随机得到CPU和内存的高峰值。我已经停用了几乎所有试图找到罪魁祸首的插件。我一直在一次打开几个,然后等待30分钟,看看服务器是否表示可以。它总是这样。今晚我有3个小时没碰它,当我回来时,我意识到我的副总裁在晚上8点和9点左右随机出现峰值。但从下午6点到8点没有问题,从晚上9点到凌晨12点30分没有问题。它说我的问题是索引。php。这是26日随机开始的。没有新插件,没有脚本更改,根本没有区别。我如何找出问题所在?More Info:我在VPS上安装了两个wordpress。其中一个是我的主网站,我和大约3