PHP - Consulta Proceso por Lotes.

 
Vista:
Imágen de perfil de Nicolás Ignacio
Val: 14
Ha aumentado su posición en 15 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consulta Proceso por Lotes.

Publicado por Nicolás Ignacio (21 intervenciones) el 07/08/2015 22:29:32
Estimados !!!

Quisiera saber si alguien tiene experiencia o si sabe cómo hacer un proceso donde sea condición procesar todos los registros de un archivo o ninguno.

Me explico mejor...

Tengo un archivo .txt , el cual interpreto línea a línea en un array, cada índice es una línea. Luego los separo según el diseño de registros que me da el creador y así logro la información necesaria para guardar en la base de datos.

Luego lleva algunas validaciones, porque no todas las líneas son iguales, algunas encabezados, algunas detalle y otras trailers.

Pero ese no es el inconveniente, todo esto lo ejecuto con un foreach, pasando por cada línea, y cada vez que paso guardo en la base de datos llamando a un procedimiento almacenado con PDO. Todo eso perfecto.

Ahora mi CONSULTA en sí es, si se llega a colgar la pc del cliente, si cierran la ventana o el navegador o simplemente se corta la luz, va a a suceder que de 1000 registros me guarde 500 por ejemplo. Porque el procedimiento almacenado para guardar es por cada registro, ya que por línea solo pasa un registro. El SP es manejado por transacciones, osea que puedo estar tranquilo que el registro si lo guarda es porque está consistente.

Pero la condición SI O SI es que el archivo se procese completo o no se procese. Pensé en un procedimiento almacenado para el archivo completo pero sería una locura, porque primero que el análisis es línea por línea y dependiendo del contenido de cada línea ejecuta el SP correspondiente.

Bueno espero que se haya entendido estoy dispuesto a brindar toda la información que se requiera para el que pueda y tenga un tiempo me de un poco de luz al respecto.

Muchas gracias y saludos!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Consulta Proceso por Lotes.

Publicado por xve (6935 intervenciones) el 08/08/2015 08:52:13
Hola Nicolás, no se muy bien que hace el SP, por lo que no se si esta solución te puede servir...
lo que se me ocurre, es que generes una tabla temporal de MySQL y vayas poniendo ahi todos los registros... una vez leído todo el archivo de texto, ejecutes un INSERT o un SP que vuelque el contenido de la tabla temporal a la definitiva.

Cada vez que inicies el proceso, eliminas y creas la tabla temporal, de esta manera, nunca te quedaras a medias.

No se si te puede ser de ayuda... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nicolás Ignacio
Val: 14
Ha aumentado su posición en 15 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consulta Proceso por Lotes.

Publicado por Nicolás Ignacio (21 intervenciones) el 10/08/2015 19:55:02
Estimado xve, muchas gracias por tu respuesta, siempre tan atento!!!

Lo mismo supuse, el hecho creo que omití lo siguiente:

La problemática empieza porque el archivo lo divido en 3 tablas en la base de datos, una tabla HEADER, una tabla DETAIL, y otra tabla TRAILER, o TRAILER1, 2, 3. Hasta 3 trailers tienen algunos archivos.

Entonces lo que hacen los SP es recibir los parámetros para luego insertar cada registro en la tabla que le corresponda, y esto controlado con transacciones, START TRANSACTION, si todo va bien COMMIT sino ROLLBACK.

Entonces seguro va a procesar los registros que pertenezcan a una tabla, pero puede dejarme la otra sin completar, por lo cual todo el archivo completo no fue procesado.

El diseño es así, porque dentro del mismo archivo por ejemplo el header, no tiene la misma cantidad de campos ni del mismo tipo que el detail y así sucesivamente, y hacer todo el archivo en una sola tabla iban a ser como 200 campos lo cual me dio para normalizar y unirlos mediante un campo en común al cual llamo código de archivo único. Y luego las consultas vienen solas.

Los muestro con una vista unificada ya que no todos los campos le sirven a los usuarios.

Ahora se me ocurrió lo siguiente, en vez de ir creando tablas temporales, si creo varios archivos temporales .txt en una carpeta temporal, donde vaya ya creando los registros formateados para luego insertarlos con un solo SP??? y una vez hecho eliminar los archivos con unlink???

No estaría mal no?

Entonces primero creo todos los archivo y controlo que se genere bien, luego llamo al SP donde haga LOAD DATA de cada .txt en cada tabla? y con START TRANSACTION, o se procesa todo o no se procesa nada.

Qué parece? medio enroscado no???

Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consulta Proceso por Lotes.

Publicado por Vainas (262 intervenciones) el 09/08/2015 19:20:09
Buenas:

Creo que me vas a tener que dar mas datos por que sino no entiendo. Es que no entiendo en que momento del proceso se puede colgar y tu tener un problema y quedarse todo a medias. Es que el servidor esta en el propio cliente?

Un buen punto el que marca xve. Yo añado las transacciones en mysql. Imagino que se puede generar una transaccion y luego hacer un commit o un rollback(esto tiene matices ya que hay sentencias en mysql que llevan asociado el commit).

Si el problema lo tienes en el fichero que temes que se pueda a llegar a romper siempre tienes los bloques try...catch para dejar todo como estaba.

El problema no creo que pueda estar en la subida de datos del cliente por que php no empezara a procesar hasta que no tenga todos los valores de su lado asi que no puede haber cortes en ese aspecto (o eso al menos creo yo).

Sobre el punto anterior he conseguido esto: http://php.net/manual/en/features.connection-handling.php

El primer ejemplo me resulta interesante ya que despues de cerrar la session con el cliente da la impresion que php puede seguir procesando (pone que una vez que se cierra no escribas ningun resultado ni intentes leer datos ya que la siguiente llamada al script a podido cambiar los datos imagino que sera en cuanto a variables $_GET o asi).

He visto que hay gente que para el procesado usa el modo comando de php asi liberas a que el usuario espere el procesar esa tarea. Se puede hacer por linea de comandos o haciendo uso de CURL

comandos:
1
shell_exec('php script.php > /dev/null 2>/dev/null &');

Siempre recuerda usar & para poder seguir tu ejecucion sin esperar a que termine.

Resumiendo:

1. Problemas al subir el archivo? o en la llegada de datos del cliente al servidor? Aqui no he encontrado nada asi que imagino que sera por que hasta que no llegan los datos no se empieza a procesar nada.
2. Problemas en el procesado? que se desconecte en medio del trabajo?. varias opciones: procesado aparte con shell_exec o lo de cerrar la session.
3. Problemas en un corte mientra se realizan los INSERT's?. para esto las transacciones o segundas tablas como dice xve.

Alguien ve algo mas?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nicolás Ignacio
Val: 14
Ha aumentado su posición en 15 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consulta Proceso por Lotes.

Publicado por Nicolás Ignacio (21 intervenciones) el 10/08/2015 19:57:27
Estimado Vainas!

Muchas gracias por tomarte el tiempo para responderme!

Bueno antes le respondí al otro amigo! Quizá abre un poco el juego y el panorama.

Estoy leyendo lo que me sugieres en la documentación de PHP, y voy a evaluarlo.

Te cuento que el cliente va a ser cada pc de usuarios y el servidor va a estar en otra ubicación. Pero puede quedar en la mitad el proceso, pensé una solución que ya la mencioné. Voy a probar y comento que tal.

Muchas gracias nuevamente!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar