Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] La mejor forma de trabajar con grandes cantidades de información

Estas en el tema de La mejor forma de trabajar con grandes cantidades de información en el foro de PHP en Foros del Web. Hola, voy al grano. Estoy trabajando en un script PHP que tiene que conectarse a un par de plataformas ( TiendaNube y PipeDrive ) y ...
  #1 (permalink)  
Antiguo 07/02/2018, 08:57
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta La mejor forma de trabajar con grandes cantidades de información

Hola, voy al grano.

Estoy trabajando en un script PHP que tiene que conectarse a un par de plataformas (TiendaNube y PipeDrive) y de ellas recopilar información. El script funciona perfectamente en un ambiente de prueba donde apenas hay unos cuantos registros de información. Pero cuando paso a producción (donde hay miles de registros), el navegador muestra un 504 Gateway Timeout.

Tengo a Siteground como hosting, y el phpinfo() me dice que el max_execution_time está ajustado al máximo posible: 120 segundos.

Al script, dos minutos no le bastan para terminar de ejecutarse. Una gran parte del trabajo es armar arrays. Se me ocurrió guardar esos arrays como jSON en archivos .json y así trabajar sobre esos archivos, y no obligar al script a que cada vez que se ejecute tenga que armarlos nuevamente.

La cosa es que de momento, uno de esos .json pesa 4M (y con el tiempo irá aumentando). La verdad no sé si eso es mucho o no, y si es la mejor forma de tratar con gran cantidad de información.

Cualquier comentario que hagan, sin duda, me servirá. Y si necesitan que abunde, lo hago. Adelante.

Gracias.
  #2 (permalink)  
Antiguo 07/02/2018, 11:18
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: La mejor forma de trabajar con grandes cantidades de información

Dependiendo del proceso, 120 segundos de ejecución no es mucho.

En mi hosting, donde requiero hacer procesos realmente largos de importación de datos, lo tenemos a 30 minutos.

Sin embargo, ya que imagino no te permiten aumentar el tiempo de ejecución, te recomendaría detallar un poco el proceso, por si es posible optimizarlo.
  #3 (permalink)  
Antiguo 07/02/2018, 13:35
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Respuesta: La mejor forma de trabajar con grandes cantidades de información

Cita:
Iniciado por ocp001a Ver Mensaje
...En mi hosting, donde requiero hacer procesos realmente largos de importación de datos, lo tenemos a 30 minutos.
Ah! 30 minutos! ¿Cuál es tu hosting y qué plan tienes?

Cita:
Iniciado por ocp001a Ver Mensaje
...Sin embargo, ya que imagino no te permiten aumentar el tiempo de ejecución, te recomendaría detallar un poco el proceso, por si es posible optimizarlo.
1) En efecto, no me permiten aumenarlo, ya que es un servidor compartido.
2) Ok, va una idea general

Tiendanube = TN
PipeDrive = PD.

Tiendanube es una plataforma de comercio electrónico y Pipedrive es un CRM. Ambos tienen API's.
La idea general es pasar a PD toda la información de los clientes TN, y mantener actualizada la información: si un cliente nuevo se registra, se crea un registro en PD; si un cliente logueado en TN hace un comentario en la forma de contacto, ese comentario va a parar al registro PD de ese cliente. Con las compras es lo mismo..., con todo, prácticamente.

3) Ahora, qué hace el script:
  1. Cada vez que se ejecuta el script, éste se conecta a las API's de dichas plataformas, saca la info y genera varios arrays: uno para los clientes de TN, otro para las compras de TN, y lo mismo respecto de PD.
  2. Una vez que tengo todos los arrays que necesito, itero sobre el de clientes TN y a cada paso voy contrastando si la misma info está en los arrays con la info de PD. Dependiendo el caso, el script actualiza y/o crea esa info en PD.

4) Lo único que se me ocurre para optimizar todo.
  1. Lo que se me ocurre es dividir el script en varios scripts independientes, que se ejecuten con completa independencia unos de otros. De tal modo que el mismo script no genere todos los arrays de una vez, ya que se tarda mucho.
  2. Cada uno de esos archivos independientes creará un archivo jSON con la info de los arrays que comentaba antes.
  3. Así, contrastar la info entre TN y PD, no se realizará en la misma ejecución de un solo script, sino en otro tiempo, ya que será otro script que lo haga. De esta forma, el script que contraste la info no tendrá necesidad de conectarse a las API's y perder tiempo en recuperar la info de TN y PD, ya que la info ya estará disponible en los archivos jSON.
Saludos

Última edición por berkeleyPunk; 07/02/2018 a las 13:46
  #4 (permalink)  
Antiguo 07/02/2018, 15:17
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: La mejor forma de trabajar con grandes cantidades de información

Bueno, en tal caso sería conveniente ver si dispones de campos de fecha de última modificación, de esta manera, podrías filtrar la consulta con una fecha dada (por ejemplo los últimos 3 días) y disminuir la cantidad de registros a insertar o modificar.

Por otra parte, en vez de comparar arreglos, sería bueno que pudieras crear consultas tipo insert into... on duplicate key update..., de esta manera no le cargas a php todo el trabajo, si no a la base de datos.

Claro que lo más adecuado sería ver si es posible que al insertarse o modificarse un registro en TN puedas hacer una llamada a la api del PD, esto sería lo ideal pues consumiría menos recursos y la sincronización sería inmediata.
  #5 (permalink)  
Antiguo 03/04/2018, 18:16
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: La mejor forma de trabajar con grandes cantidades de información

Perdón por responder tan tarde!

Cita:
Iniciado por ocp001a Ver Mensaje
Bueno, en tal caso sería conveniente ver si dispones de campos de fecha de última modificación, de esta manera, podrías filtrar la consulta con una fecha dada (por ejemplo los últimos 3 días)
Tu comentario fue valioso, ya que antes de leerlo no me había fijado si las APIs en cuestión tenían opción para filtrar datos al hacer una petición GET. Resultó que una de las dos API's sí tenía esa opción.

Te comento, la 1ra etapa de este desarrollo ya terminó, pero tuvimos que adquirir un servidor dedicado, ya que ningún compartido nos servía. Tengo un par de procesos que duran casi una hora. Y sólo pudieron completarse hasta que adquirimos este servidor dedicado.

Gracias por tu apoyo!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:41.