Batch en Drupal 7 y cómo evitar time out de php.

drupal.jpg
Solucionex
21
May 13
En estos días se nos ha presentado a dos compañeros (Carlos y Raúl) un reto muy similar en respectivos proyectos Drupal.
 
El primero enviar una gran cantidad de correos y el segundo importar información de un servicio externo desde xml.
 
Después de revisarlo entre los dos, utilizar Batch API nos ha parecido la mejor opción. Aquí os presentamos un ejemplo de lo que hemos hecho.
 
 

En la función submit del módulo realizamos la llamada a batch_books_bulk_batch($isbns)

$isbns es un array de ISBN de libros

$batch = batch_books_bulk_batch($isbns); batch_set($batch);

En la función batch_books_bulk_batch($isbns)

$num_operations = count($isbns); $batch = array( 'operations' => array(), 'finished' => 'batch_books_bulk_finished', 'title' => t('Processing batch 2'), 'init_message' => t('Batch 2 is starting.'), 'progress_message' => t('Processed @current out of @total.'), 'error_message' => t('Batch 2 has encountered an error.'), 'file' => drupal_get_path('module', 'books') . '/books.bulk.inc', ); // $operations = array(); for ($i = 0; $i < $num_operations; $i++) { $isbn = $isbns[$i]; if($isbn) { $batch['operations'][] = array('batch_books_bulk_op', array($isbn)); } } return $batch;

En la línea 3 a 11 se define el batch

La línea 'file' => drupal_get_path('module', 'books') . '/books.bulk.inc' es muy importante si definimos la función Batch fuera de nuestro fichero .module, como en esta caso. Hay que especificar la ruta al fichero que contiene la declaración del Batch.

De la 14 a la 19 se recorre el array de isbns y se llama a la función que realiza las acciones. $operations es un array con las operaciones que se ejecutarán en el proceso.

La función batch_books_bulk_op($isbns, &$context) realiza las llamadas al servicio externo que retorna un xml que se parse y almacena como contenido en Drupal.

La lógica de este módulo forma parte de un módulo que estamos desarrollando y que aportaremos a la comunidad en drupal.org en breve

Documentación sobre Batch API en drupal.org

Módulo example Batch example en drupal.org

Esperamos sea de ayuda.