开发插件时的内存管理

时间:2014-11-03 作者:Eric

我在这里搜索了这个问题,有很多关于内存问题和WordPress的查询。常见的建议修复方法是更改WORDPRESS\\u内存常量。我有一个类似的问题,我想避免重新定义这个常数。这是我在WordPress上发布的问题。组织机构:

我正在开发一个插件,它有许多自定义查询。

我正在寻找一些关于插件运行时如何最好地处理问题的指导。

激活后,我需要一个方法来遍历所有帖子、页面和自定义帖子类型(CPT),并为每个帖子、页面和CPT添加4个自定义字段。

以下是我使用的代码:

$internal   = array( \'page\', \'post\' );
$cpt_args = array(
    \'public\' => true,
    \'_builtin\' => false
);
$custom = get_post_types( $cpt_args, \'objects\' ); 

foreach ($custom as $name => $data) {
    $internal[] = $name;
}
$avail_posttypes = $internal;

$args = array(
    \'post_type\' => $avail_posttypes,
    \'post_status\'   => \'any\',
    \'numberposts\'   => -1,
    \'cache_results\' => false,
    \'no_found_rows\' => true,
    \'fields\'    => \'ids\',
);
$all_posts = get_posts($args);

foreach ($all_posts as $post) {
    if( !update_post_meta( $post->ID, \'_cf_one\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_one\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_two\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_two\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_three\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_three\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_four\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_four\', \'ok\', true );
    }
}

$img_args = array(
    \'post_type\' => \'attachment\',
    \'numberposts\'   => -1,
    \'cache_results\' => false,
    \'no_found_rows\' => true,
    \'fields\'    => \'ids\',
);
$img_posts = get_posts($img_args);

foreach ($img_posts as $post) {
    if( !update_post_meta( $post->ID, \'_cf_one\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_one\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_two\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_two\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_three\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_three\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_four\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_four\', \'ok\', true );
    }
}
我试图优化我的查询,以避免消耗任何不必要的资源。但它似乎在进入查询以处理图像之前运行了我们的内存。

我正在测试的特定网站有600多篇帖子、页面和自定义帖子类型(组合)。

我在wp config中更改了内存设置。php为128M。但是我想找到一种方法来做到这一点,这样普通用户就不需要修改这个值或php中的任何内容。ini文件。

我还可以做更多的事情来优化这个请求吗?有关于WordPress如何管理与查询相关的内存的文档吗?

查询监视器插件还显示,当插件激活大约59个查询时,我会消耗大约37M内存。当我的插件被停用时,内存会下降到20M,因此我想大大减少这个数量。

我希望能够根据需要分配内存,或者以不消耗太多内存的方式重新构造查询。如有任何建议,将不胜感激。

1 个回复
最合适的回答,由SO网友:Elian ten Holder 整理而成

您可以尝试在帖子块中解决此问题,而不是同时处理所有帖子,您当前正在将所有帖子加载到内存中,然后使用这些帖子查询数据库,这不是非常有效。

你可以得到帖子的总数,然后以25个或更多的块来查询它们。然后进行查询,然后用下一个25重新开始。

如果你需要,我可以编一些代码来说明我的答案。

编辑:
我创建了一个示例,希望能解决您的问题。我修复了第一个查询块,因此如果这样做有效,您(或我)可以以相同的方式将其应用于第二个查询块。

不幸的是,我手头没有Wordpress安装,所以可能会有bug。此外,我也不完全确定wp\\u count\\u posts和$avail\\u posttypes是否配合得很好。

<?php 
$internal   = array( \'page\', \'post\' );
$cpt_args = array(
    \'public\' => true,
    \'_builtin\' => false
);
$custom = get_post_types( $cpt_args, \'objects\' ); 

foreach ($custom as $name => $data) {
    $internal[] = $name;
}
$avail_posttypes = $internal;
// Changed the numberposts to 25 to only query 25 posts, and added an offset.
$args = array(
    \'post_type\' => $avail_posttypes,
    \'post_status\'   => \'any\',
    \'numberposts\'   => 25,
    \'offset\'   => 0,
    \'cache_results\' => false,
    \'no_found_rows\' => true,
    \'fields\'    => \'ids\',
);


$total_amount_of_posts = wp_count_posts($avail_posttypes);

// Check if there are more post waiting if so then query them.
while(args[\'offset\']+args[\'numberposts\']<$total_amount_of_posts)
{
    // Get the next 25 posts.
    $posts = get_posts($args);

foreach ($posts as $post) {
    if( !update_post_meta( $post->ID, \'_cf_one\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_one\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_two\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_two\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_three\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_three\', \'ok\', true );
    }
    if( !update_post_meta( $post->ID, \'_cf_four\', \'ok\', true ) ){
        add_post_meta( $post->ID, \'_cf_four\', \'ok\', true );
    }
}
// Skip over the 25 we just queried.
args[\'offset\'] += 25;

}

结束