Cómo funciona Batch en torno al tiempo de espera de PHP


9

La documentación de Drupal 7 presenta la API de Batch como:

Funciones que permiten que el procesamiento de formularios se distribuya entre varias solicitudes de página, asegurando así que el procesamiento no se interrumpa debido a un tiempo de espera de PHP ...

Tomé esto como que Batch maneja los problemas relacionados con el tiempo de espera para el desarrollador.

Sin embargo, otras publicaciones (es decir, ¿cómo funciona internamente la API por lotes? ) Implican que es responsabilidad del desarrollador decirle a Batch cuánto trabajo hacer antes de esperar que llegue otro usuario y que Batch sea invocado nuevamente, evitando así se acabó el tiempo.

Si esto último es cierto, supongo que Batch no garantiza que los trabajos no se agotarán. ¿Batch ofrece alguna garantía? ¿Depende del desarrollador adivinar cuánto puede procesar Batch antes de que se agote el tiempo de espera?

¡Gracias!


3
Esta es una muy buena pregunta, gracias :-)
Chapabu

Respuestas:


5

Batch simplemente dice "Haré N cantidad de cosas (como máximo) y luego actualizaré la página ... y haré más".

Si dice hacer 5 elementos por porción de trabajo que demoran 5 segundos cada uno, estaría bien con el valor predeterminado de tiempo de espera de php de 30 segundos.

Si dice hacer 20 elementos por porción de trabajo que toman 5 segundos cada uno, su carga de trabajo por solicitud es demasiado alta y es probable que se agote el tiempo de espera.

Recuerda cuando estás en PHP, el ciclo de vida de una página es request in -> response out. Y que su servidor web mantiene vivo cada hilo durante un tiempo finito. Debe evitar ese tiempo de espera, lo que la API de Batch le ayuda a hacer.

Ejecutar cosas de, por ejemplo, Drush, el lado del servidor que usa módulos comunitarios como Migrate puede ayudarlo a evitar por completo los tiempos de espera si es necesario.

EDITAR

También tenga en cuenta que cada solicitud de página es un bootstrap completo de drupal y la API de Batch comienza donde se quedó. Esa es una de las operaciones más caras cuando se usa la API de Batch, recargar drupal cada N elementos. Es por eso que la gente ha estado trabajando en técnicas del lado del servidor para crear nodos, importar contenido, etc. Batch API es ideal para tareas simples y repetitivas. Pero tiende a desmoronarse en conjuntos de datos complejos o muy muy grandes.


1
¿Está diciendo que se invoca Batch en cada carga de página; es decir. ¿Batch se despierta para ver si hay alguna tarea (como el cron del pobre)? Esto se sospechaba; sin embargo, no entiendo por qué enfatizó el costo computacional del proceso. ¿No es el costo adicional solo unas pocas comparaciones y cualquier trabajo que Batch tenga en su cola o Batch está haciendo algo especial como llamarse cargando una página?
Tostadora

1
ver la respuesta de kiamlaluno a continuación. Una página de barra de progreso del lote simplemente se vuelve a cargar después de X segundos. Si carga Firebug o Chrome en la pestaña Red y ejecuta un trabajo de Batch API, mire las URL y simplemente verá la misma página llamada con diferentes desplazamientos de elementos y tamaños de fragmentos. El costo de cómputo del arranque de todo drupal en cada solicitud de página es ALTO. Ejecutar una importación de Drush sql carga drupal solo una vez, por ejemplo. Para grandes conjuntos de datos y problemas, la sobrecarga de la API de Batch se vuelve demasiado alta.
tenken

3

La API por lotes simplemente se registra _batch_shutdown()como función de apagado con register_shutdown_function(). Esa función simplemente guarda en una tabla de base de datos el estado actual del lote que se está ejecutando.
Batch API no proporciona ninguna garantía de que la operación que está ejecutando no se interrumpa en el medio. Es por eso que las operaciones por lotes normalmente ejecutan operaciones simples como leer una fila de la base de datos al guardar una tabla y guardar una fila de la base de datos en otra tabla.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.