Problema Recorrer Json Y Subida Por Api

ManuelBermudez Seguir

Curioso
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
30 Ene 2018
Mensajes
12
Buenas,
Os cuento mi problemática a ver si me podéis dar la solución correcta a lo que quiero realizar.

Problematica:
Tengo un archivo json, el cual suele tener entre 9000 y 15000 items de datos de clientes.

La cosa es que quiero recorrer cada uno de estos item, para subirlo a un Saas mediante su API. Pero no quiero subir 9000 o 15000 item de una, si no que me gustaría que se subiera en grupos de 50 o 60 items, esperase al menos un segundo o 2 para subir el siguiente grupo.

Si lo hago todo de una, la API podría limitar la subida. Y se que si se hace algo más "lento" no habría problema.

Tengo el siguiente código que muestro abajo, pero incluso estableciendo el set_time_limit(30) antes de cada grupo, aun así, cuando el servidor mediante cron ejecutar el php, parece que no llega acabar el proceso.

Se que todo tiene su fin y no entra en bucle infinito, porque he realizado las pruebas comentando el set_time_limit(30) y el sleep(1), y termina correctamente.

$pathJSON = dirname(__FILE__).'/json_clientes.json'; $array = json_decode(file_get_contents($pathJSON), TRUE); $arrayChunks = array_chunk($array, 50); foreach ($arrayChunks as $k => $chunk) { set_time_limit(30); foreach ($chunk as $data) { //Codigo para insertar mediante API } sleep(1); }

A ver si podéis ayudar, ya sea porque veáis una mejora en el código, u otra forma de hacerlo.

Muchas gracias de antemano.
 

fabgonber

VIP
Zeta
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Suscripción a IA
Desde
4 Abr 2019
Mensajes
1.998
Hola,

Dos programas:
1) el primero lee tu json y lo mete en una base de datos... nótese el ultimo campo de la tabla enviado que vale FALSE si es que no se ha enviado a la API, vale true si es que se ha enviado. El id autonumerico.
Insertar CODE, HTML o PHP:
$pathJSON = dirname(__FILE__).'/json_clientes.json';
$array = json_decode(file_get_contents($pathJSON), TRUE);

foreach ($array as $casilla)
{
    $sql = "INSERT INTO tabla(id,...,enviado) values(null,$array[0],...,false)";
    mysql($sql);
}

2) el segundo lee la base de datos
Insertar CODE, HTML o PHP:
$sql = "SELECT * FROM tabla WHERE enviado = FALSE LIMIT 30";
$datos = mysql($sql);
if ($datos->num_rows>0)
{
       while ($dato = $datos->fetch_object())
       {
               // INSERTAR DATO VIA API
               $sql = "UPDATE tabla SET enviado = TRUE where id = $dato->id";
               mysql($sql);
       }
}

3) Luego ejecutas el segundo via cron cada minuto
 

CarlosRR

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
31 Ago 2013
Mensajes
599
Hola,

Dos programas:
1) el primero lee tu json y lo mete en una base de datos... nótese el ultimo campo de la tabla enviado que vale FALSE si es que no se ha enviado a la API, vale true si es que se ha enviado. El id autonumerico.
Insertar CODE, HTML o PHP:
$pathJSON = dirname(__FILE__).'/json_clientes.json';
$array = json_decode(file_get_contents($pathJSON), TRUE);

foreach ($array as $casilla)
{
    $sql = "INSERT INTO tabla(id,...,enviado) values(null,$array[0],...,false)";
    mysql($sql);
}

2) el segundo lee la base de datos
Insertar CODE, HTML o PHP:
$sql = "SELECT * FROM tabla WHERE enviado = FALSE LIMIT 30";
$datos = mysql($sql);
if ($datos->num_rows>0)
{
       while ($dato = $datos->fetch_object())
       {
               // INSERTAR DATO VIA API
               $sql = "UPDATE tabla SET enviado = TRUE where id = $dato->id";
               mysql($sql);
       }
}

3) Luego ejecutas el segundo via cron cada minuto
Por si acaso en el segundo bloque de código donde actualizas la tabla recomendaría usar PDO para evitar SQL injections.
 

ManuelBermudez

Curioso
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
30 Ene 2018
Mensajes
12
Por si acaso en el segundo bloque de código donde actualizas la tabla recomendaría usar PDO para evitar SQL injections.
Exactamente eso hice. Finalmente he realizado algo parecido a lo que comento el compañero, pero usando el bind_param para las variables que paso como datos en la QuerySQL.

Muchas gracias por los aportes.
 

¡Regístrate y comienza a ganar!

Beneficios

  • Gana dinero por participar
  • Gana dinero por recomendarnos
  • Descubre ofertas de empleo diariamente
  • Negocios seguros
  • ¡Información premium y más!

Acceder

¿Ya tienes una cuenta? Accede aquí

Arriba