GET_POST()的PHP内存友好替代方案

时间:2014-08-26 作者:dtbaker

我遇到了以下内存问题:

get_posts( array( \'posts_per_page\' => \'-1\', \'post_type\' => array( \'product\', \'product_variation\' ) )

(有数千个结果)只是尝试获取所有帖子ID的列表。

下面的代码一次捕获10个产品,希望避免任何内存限制。它似乎工作正常,但可能有一个更优雅的解决方案。

https://gist.github.com/dtbaker/acd15e542d98bff68034

$product_page = 1;
$product_per_page = 10;
$product_query = new WP_Query( array(
    \'posts_per_page\' => $product_per_page,
    \'paged\'          => $product_page,
    \'post_type\'      => array( \'product\', \'product_variation\' ),
) );
$product_ids = array();
while($product_query->have_posts() ) {
    $product_result = $product_query->next_post();
    if(!$product_result){
        // get the next lot of results.
        $product_page++;
        $product_query = new WP_Query( array(
            \'posts_per_page\' => $product_per_page,
            \'paged\'          => $product_page,
            \'post_type\'      => array( \'product\', \'product_variation\' ),
        ) );
    }else{
        $product_ids[] = $product_result->ID;
    }
}
print_r($product_ids);
我很想知道是否有更好的方法来执行“一次10种产品”查询。谢谢

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

使用fields 参数只获取ID-将节省大量内存;)

$product_ids = get_posts(
    array(
        \'posts_per_page\' => -1,
        \'post_type\'      => array( \'product\', \'product_variation\' ),
        \'fields\'         => \'ids\',
    )
);

SO网友:Matthew

运行“否”LIMIT 查询可能是内存问题的原因。

要获得所有帖子ID的列表,我们必须首先知道存在多少帖子。既然MySQL已经知道这一点,我们可以问问:

$product_query = new WP_Query( array(
    \'posts_per_page\' => 1,
    \'post_type\'      => array( \'product\', \'product_variation\' ),
    \'post_status\'    => \'publish\', // explicitly setting post_status helps memory usage
    \'fields\'         => \'ids\',
) );

$total_products_count = $products->found_posts;
此查询将尽可能少地获取帖子总数。

有了这些知识,我们可以使用$total_products_count 我们从上一个查询中发现:

$product_query = new WP_Query( array(
    \'posts_per_page\' => $total_products_count,
    \'post_type\'      => array( \'product\', \'product_variation\' ),
    \'post_status\'    => \'publish\',
    \'fields\'         => \'ids\',
    \'no_found_rows\'  => true, // to disable found_posts calculation
) );

$product_ids = $product_query->posts;

SO网友:Mayeenul Islam

get_posts()WP_Query() 两者都共享查询数据库的相同方式。我也遇到过同样的问题WP_Query() 而不是get_posts(). PHP内存有时会耗尽。然后我发现了问题所在。

罪魁祸首是:

\'posts_per_page\' => \'-1\'
使用-1 在那里,查询一直运行,直到它获取与查询匹配的每个结果,甚至可能是数百、数千或数百万。。。这是主要问题。只需将查询限制在数字10、20、100,而不是无限大(-1)。

这将达成协议。

另外,还可以看看this WPSE thread.

结束

相关推荐

Fatal error: Out of memory

我在下一个工程师尝试创建缩略图时出现了内存问题。Wp版本为3.4.1致命错误:/xxx/wp-content/plugins/nextgen-gallery/lib/gd中内存不足(已分配29884416)(尝试分配2000字节)。缩略图。股份有限公司phpon线179但我的记忆没有超出:PHP Version : 5.2.17 / 32Bit OS Memory limit : 128 MByte Memory usage : 27.75 MByte我正不顾一切地试图解决这个问题。乔,非