Problema Recorrer Json Y Subida Por Api

ManuelBermudez

Curioso
Verificación en dos pasos activada
¡Usuario con pocos negocios!
Desde
30 Ene 2018
Mensajes
9
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
Dseda
Verificado con videollamada
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
4 Abr 2019
Mensajes
1.064
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

Gamma
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
31 Ago 2013
Mensajes
469
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
¡Usuario con pocos negocios!
Desde
30 Ene 2018
Mensajes
9
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.
 

Crea una cuenta o accede para comentar

Debes ser un miembro para poder comentar

Crear cuenta

Crea una cuenta en nuestra comunidad

Acceder

¿Ya tienes una cuenta? Accede aquí


Arriba