我有几千篇帖子,需要在管理中列出所有帖子。当我使用WP\\u Query一次获取它们时,我得到了一个内存错误。然后,我将其拆分为几个查询调用,在256 MB的限制下运行良好。代码如下:
$limit = 200;
$offset = 0;
while (TRUE) {
$posts = new WP_Query(array(
\'posts_per_page\' => $limit,
\'offset\' => $offset,
\'post_type\' => $post_type,
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'post_status\' => array(\'publish\', \'private\', \'draft\', \'inherit\'),
));
if (!$posts->have_posts()) break;
while($posts->have_posts())
{
$posts->the_post();
# do some echoing with the $post
}
$offset += $limit;
} /*(TRUE)*/
所以这在开发服务器上运行得很好。但当转移到生产环境时,它会引发内存错误
Allowed memory size of 268435456 bytes exhausted (tried to allocate 64 bytes) ...
我试着降低$limit
但它没有帮助(在dev上,它实际上可以很好地使用$limit = 500
.
我还能做些什么来强制它释放内存?
最合适的回答,由SO网友:TheDeadMedic 整理而成
这些帖子仍然保存在WordPress缓存机制下的内存中(即使您替换了$posts
在每个循环上)-操作后删除每个循环:
# do some echoing with the $post
# wipe post from memory
wp_cache_delete( $post->ID, \'posts\' );
wp_cache_delete( $post->ID, \'post_meta\' );
Pro提示:使用保存一些不必要的查询
no_found_rows => true
在查询参数中。
如果循环中没有使用类别/标记,请使用update_post_term_cache => false
在查询参数中。