有没有办法从POST变量中排除内容以节省RAM使用量?

时间:2013-05-02 作者:Programmer Dan

因此,我遇到了一个看起来像WP RAM使用问题的问题,正在寻找解决方案。

在我的站点上,我唯一真正遇到这个问题的地方是我试图填充的站点地图页面,但这个问题的解决方案可以在整个站点上普遍应用并节省RAM使用。

本质上,我的这个站点地图页面是所有postspages 在我的网站上。在此页面上,我需要访问的$post变量的唯一元素是title和permalink。不幸的是,我使用的查询返回了所有帖子,每个$post变量中都包含所有信息。

以下是我在此网站地图页面上使用的查询示例custom-post-type 命名为“产品”,自定义分类法为“补充”和术语“所有补充”。我的站点地图页面有多个这样的查询,但出于解释的目的,我只包含这个查询的代码。

 $varArray= array(
      \'post_type\' => \'products\',
      \'post_status\' => \'publish\',
      \'supplements\' => \'all-supplements\',
      \'posts_per_page\' => -1,
      \'orderby\' => \'title\',
      \'order\' => \'ASC\'
 );
 $myProducts= new WP_Query($varArray);
$post变量中保存的大部分信息(对于我的站点,我猜这一趋势在一般使用情况下都会出现)都在“内容”中。我的站点地图页面的典型RAM使用量约为140MB(由调试栏报告),而我的站点上的任何其他典型页面的使用量为50-60MB。差别很大。昨天,站点地图页面停止工作(WSOD),为了修复它,我必须增加WP可以使用的最大RAM量。因为只有一个页面,所以我增加了所有必要的系统资源。

因此,我来回答我的问题。

Wordpress中是否有我遗漏的路径/选项posts/pages 像一个普通的查询,但不是为检索到的帖子获取内容?

或者,是否有更简单的方法可以仅获取给定查询中的特定元素(Title/Permaklink/Slug/etc…)而不是得到整个$post变量shebang?

在我看来,对于许多可湿性粉剂应用程序来说,通常需要帖子/页面的“内容”的唯一位置就是pagepost 页面(显然这里也有例外),访问通过查询在其他页面上检索到的帖子/页面的全部内容是一种简单的过火行为。如果有一种方法可以避免加载帖子列表页面的全部内容,那么就可以节省大量的RAM使用。

任何帮助都将不胜感激。

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

您可以尝试直接查询post数据并设置filter 将对象发布到的字段sample 在将其传递给get_permalink() 减少内存使用。

看见get_permalink memory usage issue 了解其背后的详细推理。

SO网友:NW Tech

您可以尝试将其添加到阵列中:

\'nopaging\' => true,
\'no_found_rows\' => true,
\'update_post_meta_cache\' => false,
\'update_post_term_cache\' => false
这似乎是不言自明的,但本质上你并不是在查询所有的post变量,而只是查询你需要的东西。

SO网友:bosco

程序员丹,老兄!

让我们开始自定义SELECT 使用查询$wpdb 全球的抄本上有一个很好的条目Displaying Posts using a Custom Select Query. 如果你利用setup_postdata() 您可以像坐在标准Wordpress循环中一样循环查看结果:

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = \'publish\' 
    AND $wpdb->posts.post_type IN (\'post\',\'supplement\',\'another_post_type\')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT\'d data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;
此查询只提取帖子的ID、标题和GUID(用于确定帖子的永久链接),而完全忽略其他所有内容。此外,它还将结果排序为post_type 然后post_title, 尽管您可能希望使用多个查询来分离您的帖子类型(理论上性能受到的影响很小)。

显然,您可能希望跳过使用setup_postdata() 然后简单地循环$sitemap_nodes, 或者修改查询以获得所需的结果。

如果你打电话setup_postdata() 如果激活了调试模式,调用很可能会左右弹出关于(故意)丢失信息的通知。你可以扔一个@ 在确认自定义查询正常运行后,在函数调用之前抑制它们。

但这应该让你开始!您可以参考以下数据库关系图(从Database Description 第页)查找需要查询的字段:

Wordpress Database Diagram

EDIT:

内存效率最高的解决方案可能是结合了自定义SELECT 使用@Rarst的protip进行查询:)

SO网友:Dalton Rooney

WP\\u Query有一个“return fields”参数,如下所示:

$args = array(
 \'fields\' => \'ids\'
);
$query = new WP_Query( $args );
以这种方式使用时,WP\\u Query只返回post ID,而不是整个post对象。那么你可以使用get_permalink(), get_the_title(), 以及其他分类的WordPress函数,用于根据帖子ID检索您的内容。

结束

相关推荐

High CPU & Memory Spikes?

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