New question

Question:

Date: 17-08-2018 03:54:53 (In Spanish)

¿Cómo dejar la ejecución de una tarea muy pesada en cola (ejecutándose en segundo plano) al cerrar el navegador?[Unresolved]

Hola chicos, en esta oportunidad vengo con una duda que espero puedan orientarme a resolver.
He creado un script en PHP que permite cargar un archivo CSV con gran cantidad de datos(para cargarlo hago uso de petición AJAX). Este script extrae los datos del archivo, luego comprueba que estos datos no esten ya almacenados en la base de datos, hace uso de otro script para obtener información de cada dato que se va extrayendo del archivo y finalmente guarda los datos que hayan pasado con éxito todo ese proceso de validación en una tabla de BD.
Es un proceso que puede durar pocos segundos o muchos minutos, debido a que existen archivos que puedo subir que contengan más de 100 mil datos, por lo que no me gustaría dejar el navegador abierto todo el tiempo que dure el proceso.

Lo que deseo saber es cómo podría dejar este proceso ejecutándose internamente en el servidor al cerrar el navegador. Algo asi como ponerlo en cola y dejar que siga ejecutándose al cerrar mi navegador.
Una vez que vuelva a abrir el navegador y me dirija al script que me muestre como va el proceso actualmente. La idea es que no se interrumpa el procesamiento de los datos al cerrar mi navegador.

Alguna sugerencia o ejemplo que pudieran darme para lograr esto?
Tags: AJAX - Bootstrap - CSV - Database - Development - Form - Framework - FTP Client - HTML - HTML5 - HTTPS - Input - Javascript - Javascript Array - JQuery - JQuery UI - MySQL - MySQL Developing - OOP - Opinion - PHP - PHP Advanced - PHP MySQLi - PHP PDO - PHP7 - Query - Question - Script PHP - Security - Server - SQL - Start in Programming - Suggestion - Web - Web Browser - Webservices Votes: 0 - Answers: 10 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 17-08-2018 09:15:44 Podrias almacenar la tarea en una base de datos donde indique el archivo a cargar, y el esta de este, luego programas un cron que ejecute la verificacion cada tanto y si encuentra en tu tabla tareas pendientes las ejecute   Votes: 1 - Link answer
     
  • Date: 17-08-2018 10:56:39 Lo intentare de esa forma a ver qué tal me va, al principio había pensado en algo asi pero dude un poco por el hecho de querer hacer que el servidor haga comprobaciones cada cinco minutos aun cuando no hayan tareas pendientes   Votes: 1 - Link answer
     
  • Date: 17-08-2018 11:23:47 hay muchas maneras en las que puedes hacer dicha tarea, unas mas complicadas que otras, por ejemplo, podrías utilizar firebase de google para evitar el cron montando una app gratuita en heroku y que esta mini app o servicio sea el encargado de verificar firebase cada tanto, si detecta un servicio pendiente le notifica a tu server para que este ejecute la tarea por ejemplo y así evitar que un cron este leyendo tu base cada tantos minutos.

    Es cuestion de estilos y de que tengas pensado al final.
      Votes: 2 - Link answer
     
  • Date: 17-08-2018 12:12:31 la idea de la mini app no suena mal, pero voy a emprzar a probar la idea de cron a ver cómo va. Lo que no me queda muy claro es qué datos podria almacenar en la base de datos (aparte del status y un id para identificar cada tarea), porque puedo poner a ejecutar mi script y a los 10 minutos tal vez cerrar el navegador porque se esta tardando el procesamiento de mis datos debido a que son muchos, pero entonces al cerrar el navegador debo almacenar información de dicha tarea no completada en una tabla que luego por medio de cron se estara consultando cada 5 minutos?   Votes: 0 - Link answer
     
  • Date: 17-08-2018 12:38:19 yo haria en mi formulario de carga un select donde indico si quiero ejecutar la tarea de una vez porque se que son pocos o si la quiero ejecutar programada, asi que indico cuando y a que hora quiero dicha ejecución por ejemplo, algo asi como windows 10 y la reprogramacion de actualizaciones   Votes: 0 - Link answer
     
  • Date: 17-08-2018 13:19:09 Esa seria una buena idea definitivamente, el problema es que para este caso en particular no es viable. El formulario solo puede tener el campo input file para seleccionar el archivo y el botón cargar que hace el llamado de inmediato al script. No se requiere mandarla a ejecutar luego   Votes: 0 - Link answer
     
  • Date: 21-08-2018 08:31:03 Otra opción es usar cron de linux, así lo he hecho yo en un proyecto donde producción sube diario un archivo con los series de garantías de productos, lo cual aprox son de 10 mil a 50 mil registros al dia.

    suben un archivo vía un formulario php y en server ejecuto cada 12 horas con cron un php que lee dicho archivo y realiza toda la tarea que es muy similar a tu flow, leer registro,comparar a base de datos y si es nuevo lo agrega o si cambio actualiza.

    al terminar respaldo el archivo.

    el script compara la fecha de creación del archivo respaldo vs el que esta en directorio y decide si es nuevo o no, si lo es realiza la operación.

    saludos
      Votes: 1 - Link answer
     
  • Date: 21-08-2018 09:52:01 Hola Rene, yo estoy precisamente haciendo eso, implementando la idea de CRONJob, he tenido algunos problemillas con eso porque nunca había trabajado con programación de tareas Cron ni conozco muy bien como trabaja. En mi caso hice un formulario por medio de cual el cliente sube archivos csv pero no sube uno por día sino que puede subir varios al día, los cuales pueden tener miles de datos que procesar. Por eso se requiere poner dichos archivos a ejecutarse en segundo plano para que no deje el navegador colgado en procesando. Lo que hice fue un script donde se recibe el archivo que se cargo a través del formulario y evalúa su tamaño y calcula de forma rápida cuantos registros tiene aproximadamente. Si la cantidad de registros supera un determinado valor o si el tamaño del archivo supera los 50Kb entonces inmediatamente lo almacena en una carpeta del servidor y registra en una tabla la ruta al archivo, el nombre, la fecha de subida y un estado = pendiente. y en pantalla le muestra al usuario que el archivo fue subido y esta en cola para ser procesado. Entonces hago otro script que consulta la base de datos para ver cuales son los archivos que están pendientes por procesar y elijo el más viejo para comenzar a procesarlo, una vez terminado de procesarlo se actualiza la tabla y se coloca ese archivo con estado "procesado". Ese es el script que puse a ejecutar por Cron, pero configure el tiempo de la tarea para que se ejecutara el script cada un minuto. Entonces mi pregunta es, ¿Es eficiente poner a ejecutar ese Cron cada un minuto o eso podría causar algún problema en el servidor? ¿Si por ejemplo el script empieza a ejecutarse y el archivo que tiene que procesarse contiene más de 10 mil datos obviamente va a durar más de una hora procesándose, entonces si la tarea Cron esta programada para ejecutarse cada minuto, al ejecutarse nuevamente el proceso que ya esta en curso se detiene?

    PD: Cabe acotar que coloque una condicion inicialmente en el script para que consulte la tabla de la base de datos en busca de archivos que tengan estado = procesando, si existe un archivo procesandose entonces no seguirá el script sino que ahi muere la ejecución, pero si no hay un archivo con estado procesando entonces evalúa si existen archivos con estado = Pendiente, si encuentra uno entonces si empieza a procesarlo, si no entonces ahi termina el script.
      Votes: 0 - Link answer
     
  • Date: 25-08-2018 04:14:41 no se si entendí, pero si quieres que el script se siga ejecutando cuando se cierre el navegador debes usar ignore_user_abort
    http://php.net/manual/es/function.ignore-user-abort.php
    Nota: hace mucho que no uso php
      Votes: 1 - Link answer
     
  • Date: 17-01-2019 00:00:21 puedes probar que al darle al boton y terminar de subir el fichero llamar a un shell_exec( aqui el script que hara todo);
    asi saldras de la pagina con el boton ejecutara el script que seguira corriendo hasta que acabe y tu pagina web la envias a otra que diga el proceso esta en cola o algo parecido....

    revisa la sintaxis que hablo de cabeza !!!
    un saludo !!!
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In