Dar un orden de ejecución a los elementos de feed import durante cada cron

Feed Import es sin dudas un potentísimo módulo de Drupal, no solo para crear contenido sino también para mantenerlo actualizado desde fuentes de datos externas. Si a este potencial le sumamos la posibilidad de ejecutarse en segundo plano en forma automática en cada cron, los límites de Drupal terminan casi en la otra orilla del Río de la Plata.

Para pedirle a un feed que se ejecute en segundo plano durante cada cron de Drupal, basta seleccionar process in background dentro Basic settings.

Configuración de un feed para ejecutarse en segundo plano

Todo es fantástico hasta que un determinado escenario nos exige poner un order a una cantidad de feeds. Por ejemplo, si un feed necesita una vista del mismo Drupal para actualizar o generar otro contenido.

En ese caso, será necesario recurrir a otro módulo fundamental en cada instalación de Drupal: Elysia Cron

Elysia cron nos permite tener mayor control de los procesos en segundo plano (o background) de Drupal. Nos da la posibilidad incluso de desabilitar procesos que para nuestro projecto puedan ser innecesarios, mejorando gratuitamente las prestaciones del sitio.

Dar distinto peso a cada feed

Básicamente la idea es crear nuevos cron que luego podrán ser configurados utilizando la interfaz de Elysia. En estos nuevos cron incluiremos el o los feeds a los que necesitemos dar un orden. Cada grupo de procesos lo incluiremos dentro un nuevo módulo que llamaremos cron_importer_nombre_del_feed_cron

Cada módulo cuenta tan solo con una simple función que declara el nuevo cron utilizando hook_cron. En este ejemplo se agrupan dos feeds importers indicados con su nombre en un nuevo cron.

function cron_importer_nombre_del_feed_cron() {

  $name = array(
    'feed_importer_test',
    'feed_importer_nodes',
  );
    
  for ($n = 0; $n < count($name); $n++) {
    $source = feeds_source($name[$n]);
    $source->import();  
  }
}

Una vez instalado el nuevo módulo, podremos configurar su ejecución visitando admin/config/system/cron/settings

En la sección Single job settings podremos ver el nuevo cron indicado con el mismo nombre que hemos utilizado en la función

Elysia nos dará la posibilidad de crear distintos canales (channel) agrupando distintos crons de distintos módulos. Para crear un canal basta completar el campo channel con un nombre. Los cron sin nombre serán agrupados en el canal default.

Crear un nuevo canal

Luego, cada canal podrá ser configurado individualmente permitiendonos incluso de desabilitarlo por completo. En el siguiente ejemplo, el canal default se ejecuta una vez al día y el canal feed cada 15 minutos. La sintaxis de cron está bien explicada en wikipedia.

Configuración de cada canal

Ejecutar cron.php

Existen dos maneras de ejecutar el cron de Drupal:

  • Durante la visita de un usuario (llamada poormanscron)
  • Utilizando crontab

Si tenemos la posibilidad de ejecutar scripts en el hosting o en el server donde se encuentra instalado Drupal, la segunda opción nos permitirá tener un major contron en los tiempos de ejecución. Para ponerlo en marcha, será necesario configurar los siguientes parámetros:

  • Run cron on visitor's requests, every: Seleccionar never / use external crontab
  • Cron key: Una clave segura que será el valor de la variable cron_key. Para este ejemplo uso miclaveultrasecreta. Que no es para nada segura. Es muy importante utilizar una clave con letras, números, símbolos y que sea lo suficientemente larga.
  • Allowed hosts: Ingresar las direcciones ip que tendrán el permiso de ejecutar el cron. Por lo general, con el ip público del server es suficiente.

Configuración general de Elysia cron

Luego nos falta solo crear el script:

#!/bin/bash
/usr/bin/wget -O - -q -t 1 http://www.midominio.com/sites/midominio.com/modules/elysia_cron/cron.php?cron_key=miclaveultrasecreta

Eso esto por hoy!