Haz todo lo posible por entender el código de forma correcta antes de aplicarlo a tu trabajo y si ttienes algo que aportar puedes comentarlo.
Solución:
Así es como funciona el lote (según mi entendimiento)
1. Inicializar
- Inicialice el procesamiento por lotes. Según la configuración de los clientes (navegadores) sobre si JavaScript está habilitado o no.
- Los clientes habilitados para JavaScript se identifican mediante la cookie ‘has_js’ establecida en drupal.js. Si no se ha visitado ninguna página habilitada para JavaScript durante la sesión del navegador del usuario actual, se devuelve la versión sin JavaScript.
- Si JavaScript habilitado Usos por lotes ajax solicite mantener viva la conexión a través de la solicitud.
- Si JavaScript no está habilitado El lote utiliza establece un metaetiqueta en html para hacer intervalos de actualización regulares para mantener viva la conexión a través de la solicitud.
(Así es como se actualiza la barra de progreso sobre el progreso del trabajo realizado).
Proceso por lotes
-
Para iniciar el proceso, Batch crea una cola y agrega todos los operaciones (funciones y argumentos) que defines en el lote array igual que,
$batch = array ( 'operations' => array( array('batch_example_process', array($options1, $options2)), array('batch_example_process', array($options3, $options4)), ), 'finished' => 'batch_example_finished', 'title' => t('Processing Example Batch'), 'init_message' => t('Example Batch is starting.'), 'progress_message' => t('Processed @current out of @total.'), 'error_message' => t('Example Batch has encountered an error.'), 'file' => drupal_get_path('module', 'batch_example') . '/batch_example.inc', );
Además, también asigna una identificación de lote que es única en todos los lotes.
-
Ahora, las llamadas por lotes reclaman los elementos de la cola uno por uno y ejecuta la función definida con los argumentos que se definen en ella.
- Esta es una parte crucial, la función (Operación) que implementa la operación por lotes debe fragmentar los datos y procesarlos de manera muy eficiente teniendo en cuenta Límite de memoria de PHP, tiempo de espera. No hacerlo terminará en su problema.
Me encontré con un problema de tiempo de espera al usar migrate el otro día y comencé a preguntarme cómo funciona internamente la API por lotes.
La función de lote
Las funciones que implementan Batch deben tomar las siguientes cosas con mucho cuidado,
-
Número de elementos dentro de las operaciones a procesar como,
if (!isset($context['sandbox']['progress'])) $context['sandbox']['progress'] = 0; $context['sandbox']['current_node'] = 0; $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM node'));
-
Limitar la cantidad de elementos a procesar en una llamada de función, como establecer un límite,
// For this example, we decide that we can safely process 5 nodes at a time without a timeout. $limit = 5;
-
Actualización sobre el proceso de posprocesamiento como,
// Update our progress information. $context['sandbox']['progress']++; $context['sandbox']['current_node'] = $node->nid; $context['message'] = t('Now processing %node', array('%node' => $node->title));
-
Informar al motor de lotes si el lote está completo o no,
// Inform the batch engine that we are not finished, // and provide an estimation of the completion level we reached. if ($context['sandbox']['progress'] != $context['sandbox']['max']) $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
La mayoría de los puntos anteriores se encargan de las operaciones por lotes del núcleo de Drupal si se omite en la función de implementación. Pero siempre es mejor definir en la función de implementación
Devolución de llamada finalizada por lotes
- Esta es la última devolución de llamada a la que se llama cuando se define en el lote array Por lo general, un informe de cuánto procesado, etc.
RESPUESTAS
Si se cierra la página con la solicitud por lotes, ¿se detiene el procesamiento por lotes? ¿Se reiniciará cuando se vuelva a abrir la misma URL? El módulo de migración a veces continúa, pero probablemente esté usando colas.
Sí, lo ideal sería reiniciar el lote y, como se dijo anteriormente, se basa en la función que implemente.
Para resuelve tu problema de PHP Time out use Drush batch que está disponible en el módulo de migración, pero primero busque las funciones por lotes de migrate e intente fragmentar sus datos de procesamiento.
Si se cierra la página con la solicitud por lotes, ¿se detiene el procesamiento por lotes?
Sí, se detendrá.
¿Se reiniciará cuando se vuelva a abrir la misma URL? El módulo de migración a veces continúa, pero probablemente esté usando colas.
Como dijo Dinesh, depende de la implementación.
Debería ejecutar la migración usando drush, porque
Drush se ejecuta en la línea de comandos y no está sujeto a ningún límite de tiempo (en particular, el max_execution_time de PHP no se aplica). Por lo tanto, cuando inicia un proceso de migración que se ejecuta a través de drush, simplemente se inicia y sigue funcionando hasta que finaliza.
Cuando se ejecutan procesos a través de una interfaz web, se aplica PHP max_execution_time (normalmente 30 segundos si no menos). Por lo tanto, para los procesos de larga ejecución, necesitamos utilizar la API de Batch, que gestiona la división de un proceso en varias solicitudes. Entonces, se iniciará un proceso de migración, se ejecutará durante 25 segundos aproximadamente, luego se detendrá y dejará que la API de Batch emita una nueva solicitud de página, en la que el proceso de migración se reinicia ad infinitum.
Entonces, entendiendo eso, ¿por qué Drush es mejor?
Es mas rapido
La API de Batch introduce una gran cantidad de gastos generales: cerrar y volver a invocar las solicitudes de la página, el proceso de migración debe ejecutarse nuevamente a través de todos los constructores necesarios, las conexiones de la base de datos se restablecen y las consultas se vuelven a ejecutar, etc. Y, para una importación parcial, debe seleccionar hasta donde lo dejó: si se han importado los primeros 500 registros de origen, debe encontrar el registro 501. Dependiendo de su formato de origen y de cómo esté construido, esto puede o no escalar: si está utilizando marcas de alto nivel con una fuente de SQL, la consulta en sí puede eliminar los registros anteriores y comenzar justo donde lo dejó. De lo contrario, Migrate debe desplazarse por los datos de origen en busca del primer registro no importado. Con, digamos, un archivo XML grande como fuente, después de muchas iteraciones, es muy posible que tarde más que su PHP max_execution_time para llegar a donde puede recoger, y su migración se puede estancar.
Es mas confiable
La ejecución de migraciones a través de su navegador agrega su escritorio y su conexión a Internet local como puntos de falla. Un error de red cuando la API de Batch se mueve a la siguiente solicitud de página, un bloqueo del navegador, un cierre accidental de la pestaña o ventana incorrecta pueden interrumpir su migración. Ejecutar en drush reduce las partes móviles: elimina su computadora de escritorio y la conexión a Internet local como factores.
Es más útil
Si algo sale mal cuando se ejecuta en Drush, si hay algún mensaje de error útil, lo verá. Las fallas al usar la API de Batch a menudo se tragan y todo lo que puedes ver es la completamente inútil “Una solicitud HTTP AJAX terminó de manera anormal. A continuación, se muestra la información de depuración. Ruta: / batch? Id = 901 & op = do StatusText: ResponseText: ReadyState: 4”.
Puede encontrar más información sobre esto aquí.
Mientras tanto, si desea ejecutar el lote incluso si la ventana del navegador está cerrada, considere Proceso de fondo módulo. Tiene un submódulo Lote de fondo que hace el truco.
Este módulo asume el control de la API de Batch existente y ejecuta trabajos por lotes en un proceso en segundo plano. Esto significa que si abandona la página del lote, los trabajos continúan y puede volver al indicador de progreso más tarde.
Agradecemos que desees añadir valor a nuestra información tributando tu veteranía en las explicaciones.