0

バックグラウンドでフィード キャッシュを更新する方法を探しています。

私が直面している問題を実証するには、以下のコードが役立ちます。ページにアクセスしてロードすると、30 秒ごとにキャッシュが更新されます。一度にフェッチする URL がたくさんあるため、キャッシュを再構築する必要があると、非常に遅くなります。

$urls = array(
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=w&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=n&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=b&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=el&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=tc&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=ir&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=s&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=snc&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=m&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=e&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:bagram&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:syria&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:baghdad&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:bernard_arnault&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:senkaku_islands&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:alps&output=rss'
    );

    $feed = fetch_feed_modified($urls);
    foreach ($feed->get_items() as $item):
    ?>

        <div class="item">
            <h2><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a></h2>
            <p><?php echo $item->get_description(); ?></p>
            <p><small>Posted on <?php echo $item->get_date('j F Y | g:i a'); ?></small></p>
        </div>

    <?php endforeach; 

function fetch_feed_modified($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', 30, $url)); // set the cacne timeout to 30 seconds
    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;
}   

したがって、タイムアウトに達したときにバックグラウンドでキャッシュを静かに更新するように、これを変更する方法を考えています。つまり、タイムアウトを超えても、保存されたキャッシュでページが正常に表示されます。一方、アクセス後にバックグラウンドで新しいキャッシュの構築を開始します。このようにして、訪問者はページが遅いことに気付くことはありません。

出来ますか?

4

1 に答える 1

1

さて、これは動作します。

<?php
/* Plugin Name: Sample Feed Cache Renew Crawler */

    $urls = array(
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=w&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=n&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=b&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=el&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=tc&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=ir&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=s&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=snc&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=m&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=e&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:bagram&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:syria&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:baghdad&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:bernard_arnault&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:senkaku_islands&output=rss',
        'http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=topic:alps&output=rss'
    );
    $cache_renew_interval = 30; // every thirty seconds

    // admin page
    add_action('admin_menu', 'sample_feed_cache_renew_crawler_menu');
    function sample_feed_cache_renew_crawler_menu() {
        add_options_page(
            'Sample Feed Cache Renew Crawler', 
            'Sample Feed Cache Renew Crawler', 
            'manage_options',
            'sample_feed_cache_renew_crawler', 
            'sample_feed_cache_renew_crawler_admin');
    }
    function sample_feed_cache_renew_crawler_admin() {
        global $urls, $cache_renew_interval;
        ?>
        <div class="wrap">
        <?php       

            $feed = fetch_feed_with_custom_lifetime($urls, 60*60*24 );  // lifetime for 24 hours

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

            $feed = fetch_feed($urls);

            $i = 0;
            foreach ($feed->get_items() as $item):  
                if (++$i==20) break;
            ?>

                <div class="item">
                    <h2><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a></h2>
                    <p><?php echo $item->get_description(); ?></p>
                    <p><small>Posted on <?php echo $item->get_date('j F Y | g:i a'); ?></small></p>
                </div>

            <?php endforeach;    
        ?>
        </div>      
        <?php
        wp_clear_scheduled_hook( 'sample_feed_cache_renew_crawler_event' );
        add_action('sample_feed_cache_renew_crawler_event','sample_feed_cache_renew_crawler_function');
        wp_schedule_single_event(time() + $cache_renew_interval, 'sample_feed_cache_renew_crawler_event');

}
// wp_clear_scheduled_hook( 'sample_feed_cache_renew_crawler_event' );
require_once (ABSPATH . WPINC . '/class-feed.php');
function fetch_feed_with_custom_lifetime($url, $lifetime) {
    $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', $lifetime, $url)); // set the cacne timeout to 30 seconds
    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;
}   

add_action('sample_feed_cache_renew_crawler_event','sample_feed_cache_renew_crawler_function');
function sample_feed_cache_renew_crawler_function() {
    $file = __DIR__ . '/log.txt';
    $current = date('l jS \of F Y h:i:s A') . ": cache cleared" . PHP_EOL;
    file_put_contents($file, $current, FILE_APPEND);

    global $urls, $cache_renew_interval;
    fetch_feed_with_custom_lifetime($urls, 0);  // renew the cache right away
    wp_schedule_single_event(time() + $cache_renew_interval, 'sample_feed_cache_renew_crawler_event');

}

間隔を30秒に設定しても、適切なタイミングで関数が呼び出されるとは限らないことは、私にはわかりませんsample_feed_cache_renew_crawler_function()。ログファイルには、ブラウザのリロードボタンを数分以上押し続けたにもかかわらず、2分かかることもあれば4分かかることもあると書かれています。

Codexによると、http://codex.wordpress.org/Function_Reference/wp_schedule_single_event

同じ名前のイベントから10分以内にイベントをスケジュールすることは、スケジュールされた各イベントに$ argsの一意の値を渡さない限り、無視されることに注意してください。

しかし、ログファイルは関数が2分かそこらの間隔で呼び出されたことを示しています。したがって、それは意味がありません。

于 2012-09-18T16:22:45.893 に答える