是否仅在cron中刷新外部提要?

时间:2011-02-21 作者:Jan Fabry

是否有一种简单的方法来确保外部馈送(通过fetch_feed()) 仅通过cron获取,而不是在普通用户访问站点时获取?这是出于性能方面的原因,我想尽量减少页面加载时间。

在正常请求中加载提要的唯一时间可能是缓存为空(第一次加载)时,也可能是登录用户访问页面时(因为我将是唯一一个拥有用户帐户的用户)。

3 个回复
SO网友:EAMann

我的建议是为fetch_feed(). 通过WordPress的cron调用包装器函数,您不应该有问题。

比如:

function schedule_fetch_feeds() {
    if ( ! wp_next_scheduled( \'cron_fetch\' ) ) {
        wp_schedule_event( time(), \'hourly\', \'cron_fetch\', \'http://blog1.url/feed\' );
        wp_schedule_event( time(), \'hourly\', \'cron_fetch\', \'http://blog2.url/feed\' );
    }
}

function fetch_feed_on_cron( $url ) {
    $feed = fetch_feed( $url );

    delete_transient( "feed-" . $url );

    set_transient( "feed-" . $url, $feed, 60*60 );
}

add_action( \'wp\', \'schedule_fetch_feeds\' );
add_action( \'cron_fetch\', \'fetch_feed_on_cron\', 10, 1 );
记住,我还没有机会测试这个

您可以使用以下方法从瞬态中提取馈电:

function get_cached_feed( $url ) {
    $feed = get_transient( "feed-" . $url );
    if ( $feed ) return $feed;

    $feed = fetch_feed ( $url );
    set_transient( "feed-" . $url, $feed, 60*60 );
    return $feed;
}
如果瞬态存在,函数将获取它并返回它。如果没有,函数将手动获取它,缓存它,然后仍然返回它。

SO网友:EAMann

打破我自己的规则,添加第二个答案。。。但由于一个非常具体的原因。。。

我仔细查看了fetch_feed() 针对Rarst对原始问题的评论:

这里的圣杯是让本机fetch\\u feed()在cron中异步获取所有提要,而不是在用户加载前端页面时

实际功能代码为:

function fetch_feed($url) {
    require_once  (ABSPATH . WPINC . \'/class-feed.php\');

    $feed = new SimplePie();
    $feed->set_feed_url($url);
    $feed->set_cache_class(\'WP_Feed_Cache\');
    $feed->set_file_class(\'WP_SimplePie_File\');
    $feed->set_cache_duration(apply_filters(\'wp_feed_cache_transient_lifetime\', 43200, $url));
    do_action_ref_array( \'wp_feed_options\', array( &$feed, $url ) );
    $feed->init();
    $feed->handle_content_type();

    if ( $feed->error() )
        return new WP_Error(\'simplepie-error\', $feed->error());

    return $feed;
}
省去你阅读SimplePie() 对象这个$feed->init() 函数首先检查是否正在缓存提要,如果是,则从缓存中检索,而不是从原始源重新请求提要。

每个feed缓存43200秒(或12小时),这是瞬态的生存期。您可以使用“wp\\u feed\\u cache\\u transient\\u lifetime”筛选器向上或向下修改此选项。

为了解决最初的问题,提要不是通过cron重新获取的。它们只提取一次,然后缓存以备将来使用。用户第一次访问页面时加载提要的唯一时间是缓存为空时。对于高流量站点,这种情况应该相对少见。

因此,如果您面临与提要相关的性能问题,那么您可能还有其他问题。

SO网友:Ashfame

您如何存储(&A);通过本机linux cron在选项表中保持更新,只需在页面上获取(数据库读取)。这样,页面加载时间就不会受到任何影响。

Edit: 阿尔丽特!如果您熟悉alternate cron在WordPress中的工作方式,请创建另一个进程,然后继续其工作。采用这种方法似乎是一个很好的解决方案,可以解决您的案例以及启动此类请求的瞬态。

结束

相关推荐

rss feed code help

这个rss提要问题已经解决了,但现在当我尝试此代码时<a href=\"<?php echo get_post_comments_feed_link($feed); ?>\">RSS feed of this post</a> 在我的归档页面上,我得到了错误的url提要我想要的是当我点击这个提要时,我应该得到当前页面的所有提要,也就是说,我的url是http://mbas.in/location/mba-in-ghana 位置是我的自定义分类法,如果我在url中写这个h