Обновление кеша WordPress в фоновом режиме
Я ищу способ обновления кэшей каналов в фоновом режиме.
Чтобы продемонстрировать проблему, с которой я сталкиваюсь, поможет следующий код. Он обновляет кэш каждые 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;
}
Поэтому мне интересно, как я могу изменить это так, чтобы он молча обновлял кеш в фоновом режиме, когда истекает время ожидания. Я имею в виду, что она показывает страницу нормально с сохраненным кешем, хотя время ожидания превышает; с другой стороны, он начинает создавать новый кеш в фоновом режиме после доступа. Таким образом, посетитель никогда не увидит, что страница медленная.
Является ли это возможным?
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 минуты, хотя я продолжал нажимать кнопку перезагрузки браузера более этих минут.
Согласно Кодексу, http://codex.wordpress.org/Function_Reference/wp_schedule_single_event,
Обратите внимание, что планирование события в течение 10 минут после события с тем же именем будет проигнорировано, если вы не передадите уникальные значения для $args каждому запланированному событию.
Но файл журнала сообщает, что функция была вызвана примерно через 2 минуты. Так что это не имеет смысла.