¿Actualizar fuentes externas solo en cron?

4

¿Existe una manera fácil de garantizar que las fuentes externas (a través de fetch_feed() ) solo se obtengan a través de cron, y no cuando un usuario regular visita el sitio? Esto es por razones de rendimiento, quiero minimizar el tiempo de carga de la página.

La única vez que un feed debería cargarse en una solicitud normal es probablemente cuando la memoria caché está vacía (la primera vez que se carga) y tal vez cuando un usuario conectado está visitando la página (porque yo seré el único con un cuenta de usuario).

    
pregunta Jan Fabry 21.02.2011 - 17:24

3 respuestas

2

Mi recomendación sería configurar un contenedor para fetch_feed() . Llame a la función de envoltura a través del cron de WordPress y no debería tener ningún problema.

Entonces algo como:

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 );

Ten en cuenta, ¡No he tenido la oportunidad de probar esto todavía! Pero debería crear trabajos cron para capturar cada una de tus fuentes y almacenarlas temporalmente. en transitorios. Los transitorios tienen una caducidad de 1 hora, porque el cron debería actualizarlos de manera realista cada hora de todos modos.

Puede extraer las fuentes de los transitorios utilizando:

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;
}

Si el transitorio existe, la función lo toma y lo devuelve. Si no lo hace, la función lo tomará manualmente, lo almacenará en caché y, a la vez, lo devolverá.

    
respondido por el EAMann 24.02.2011 - 19:28
2

Rompiendo mi propia regla y agregando una segunda respuesta ... pero por una razón muy específica ...

Le eché un vistazo más de cerca al código central real para fetch_feed() en respuesta al comentario de Rarst sobre la pregunta original:

  

El Santo Grial aquí sería hacer que fetch_feed () nativo obtenga todos los feeds de forma asíncrona en cron y nunca cuando el usuario carga una página de inicio.

El código de función real es:

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;
}

Para ahorrarle la molestia de leer el objeto SimplePie() ... la función $feed->init() primero verifica si estamos almacenando en caché la fuente y, si es así, se recupera de la caché en lugar de volver a solicitar la fuente de la fuente original.

Cada feed se almacenó en caché durante 43200 segundos (o 12 horas), que es la vida útil del transitorio. Puede modificar esto hacia arriba o hacia abajo utilizando el filtro 'wp_feed_cache_transient_lifetime'.

Para abordar la pregunta original

Los feeds no se recuperan a través de cron. Se recuperan una vez, luego se guardan en caché para uso futuro. La única vez que se carga un feed cuando un usuario visita la página por primera vez es cuando el caché está vacío. Para un sitio de alto tráfico, esto debería ser relativamente raro.

Entonces, si estás enfrentando problemas de rendimiento relacionados con las fuentes, es probable que tengas algún otro problema.

    
respondido por el EAMann 24.02.2011 - 21:44
0

¿Qué tal si almacenas & manténgalos actualizados en la tabla de opciones por el cron nativo de Linux y simplemente acceda a las páginas (lectura de la base de datos). De esta manera, los tiempos de carga de la página no se verán afectados en absoluto.

Editar: ¡Alrite! Si está familiarizado con cómo funciona el cron alternativo en WordPress creando otro proceso y luego continúe con su trabajo. Adaptar ese enfoque parece ser una buena solución para su caso junto con los transitorios para iniciar dicha solicitud.

    
respondido por el Ashfame 25.02.2011 - 20:16

Lea otras preguntas en las etiquetas