
Te recomendamos
Contenido relacionado
Simplificando Tareas con Batch en Drupal 9
En el vertiginoso mundo del desarrollo web con Drupal 9, la eficiencia es clave para el éxito. Una herramienta valiosa que pocos conocen a fondo pero que puede marcar la diferencia en la optimización de procesos es el Batch API de Drupal. En este artículo, exploraremos cómo aprovechar al máximo esta funcionalidad, descubriendo sus ventajas y revelando cómo puede transformar la forma en que manejas tareas intensivas en tu sitio web.
¿Qué es el procesamiento por lotes?
Imagina que tienes que procesar una gran cantidad de datos: importar información desde una fuente externa, limpiar datos internos o ejecutar una acción en varios nodos. Sin embargo, cargar todo esto en una sola página podría ser problemático. Aquí es donde entra en juego el procesamiento por lotes.
El API de batch divide la tarea en pequeñas partes, cada una ejecutada como una solicitud de página independiente. Esto evita que el servidor se sobrecargue y permite que los usuarios reciban actualizaciones sobre el progreso de la operación.
Drupal 9 nos presenta el Batch API como una solución ingeniosa para gestionar tareas que requieren un procesamiento por lotes. En lugar de enfrentarse a la carga de recursos que implica procesar grandes cantidades de datos de una sola vez, el Batch API divide estas tareas en pequeñas porciones, facilitando así la gestión y ejecución sin agotar los recursos del servidor.
Ventajas de Utilizar Batch:
- Optimización de Recursos:
Al dividir tareas en lotes, el Batch API evita la sobrecarga de recursos, garantizando un rendimiento constante y una experiencia del usuario sin interrupciones.
- Manejo de Tareas Pesadas:
Tareas como la actualización masiva de nodos o la importación de datos extensos se vuelven más manejables al utilizar el procesamiento por lotes, reduciendo el riesgo de agotamiento de memoria y tiempo de ejecución.
- Seguimiento y Progreso:
El Batch API proporciona una interfaz clara para el seguimiento del progreso de las tareas, permitiendo a los desarrolladores y administradores monitorear el estado de las operaciones en tiempo real.
- Tolerancia a Errores:
En caso de un error durante la ejecución de una tarea, el Batch API es capaz de manejarlo de manera elegante, permitiendo la reanudación de la tarea desde el punto de interrupción, minimizando así la pérdida de datos y tiempo.
Eficiencia: Al dividir una tarea en fragmentos más pequeños, evitamos agotar los recursos del servidor. Por ejemplo, podemos procesar 10,000 elementos sin causar tiempos de espera de PHP.
- Feedback en tiempo real:
Los usuarios pueden ver el progreso de la operación mientras se ejecuta. Esto es especialmente útil para tareas prolongadas.
- Interrupciones controladas:
Si una operación falla, no perdemos todo el progreso. Podemos reanudar desde donde se detuvo.
Proceso
Implementar Batch en Drupal 9 es un proceso relativamente sencillo:
- Definir la Operación:
- Define la operación que deseas realizar por lotes. Puede ser una actualización masiva, una importación de datos, o cualquier tarea que pueda dividirse en partes.
- Define la operación que deseas realizar por lotes. Puede ser una actualización masiva, una importación de datos, o cualquier tarea que pueda dividirse en partes.
- Configurar el Array Batch:
- Configura un array Batch que describa la operación, indicando cómo dividir las tareas y qué funciones utilizar para su procesamiento.
- Configura un array Batch que describa la operación, indicando cómo dividir las tareas y qué funciones utilizar para su procesamiento.
- Ejecutar el Batch:
- Llama a la función batch_set() y batch_process() para ejecutar el lote. Drupal se encargará del resto, dividiendo y ejecutando las tareas según la configuración proporcionada.
- Llama a la función batch_set() y batch_process() para ejecutar el lote. Drupal se encargará del resto, dividiendo y ejecutando las tareas según la configuración proporcionada.
- Gestionar el Progreso:
- Utiliza las funciones provistas por el Batch API para monitorear y mostrar el progreso de la operación al usuario, brindando una experiencia transparente.
Ejemplo
Dentro de un formulario de tu módulo custom como el ejemplo de la siguiente ruta:
web/modules/custom/example-module/src/Form/BatchExampleForm.php
Dentro de la función submit puedes definir el array de datos a procesar por lotes con el Batch API de drupal
Por ejemplo, debemos actualizar un campo de todos los nodos de un tipo de contenido, entonces los llamamos con el entity TypeManager y definimos el array de los datos a operar:
$value = $form_state->getValues()['new_value'];
$entities = $this->entityTypeManager->getStorage('node')->loadByProperties([
'type' => 'example_type'
]);

luego debemos inicializar la variable del batch y la variable de las operaciones y recorrer el array de las entidades para poder realizar la tarea por lotes , esto asigna valores a cada uno de los nodos dentro del array de entidades.
En el recorrido del array de las entidades se asignan en el array de operaciones a cada uno de los nodos dentro del array:
$operations = [];
$batch = [];

foreach ($entities as $key => $node) {
$operations[] = [
'batch_hook',
[
[
'Entidad' => $node,
'value' => $value,
],
$this->
t('(Operation node @operation)', ['@operation' => $key])
],
];
}
Luego asignamos el valor del batch que se ejecutará

$batch = [
'title' =>
$this->
t('Creating an array of @num operations',
['@num' => count($entities)]),
'operations' => $operations,
'finished' => 'batch_example_finished_hook',
];
Importante se ejecuta el Batch
batch_set($batch);
En el .module de nuestro modulo ejecutamos los hooks definidos en el batch anterior:

igual al definido en el $operacions

Definimos los datos y lo que queremos hacer con esos datos en la ejecución del batch.

function batch_hook($id, $operation_details, &$context) {
//traemos los valores asignados previamente
$value = $id['value'];
$node = $id['Entidad'];
//ejecutamos la operacion necesaria
$node->set('field_example', $value);
$node->save();
}
Luego se ejecutará la funcion del finish

function batch_example_finished_hook($success, $results, $operations) {
$messenger = \Drupal::messenger();
if ($success) {
// Here we could do something meaningful with the results.
// We just display the number of nodes we processed...
$messenger->addMessage(t('@count results processed.', ['@count' => count($results)]));
$messenger->addMessage(t('The final result was "%final"', ['%final' => end($results)]));
}
else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
$error_operation = reset($operations);
$messenger->addMessage(
t('An error occurred while processing @operation with arguments : @args',
[
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], TRUE),
]
)
);
}
}
Dominar el uso de Batch en Drupal 9 no solo mejora la eficiencia de tus operaciones, sino que también contribuye a la estabilidad y rendimiento de tu sitio web. Al implementar esta poderosa herramienta, te posicionas para enfrentar desafíos de procesamiento intensivo con confianza, asegurando una experiencia del usuario fluida y optimizada. Descubre el potencial oculto de la Batch API y lleva tu desarrollo web con Drupal 9 al siguiente nivel. ¡La eficiencia nunca había sido tan accesible!
El procesamiento por lotes es una herramienta esencial para cualquier proyecto Drupal. Nos permite manejar grandes volúmenes de datos sin sacrificar la experiencia del usuario. Así que la próxima vez que enfrentes una tarea pesada, ¡piensa en el poder de los lotes!
Suscrebete a nuestro boletin
drupal
PHP
Actualización Eficaz: De Drupal 9.5 a 10.2
Inteligencia artificial
Últimas entradas
Actualización Eficaz: De Drupal 9.5 a 10.2
- Inicie sesión para enviar comentarios