Problema Recorrer Json Y Subida Por Api

  • Autor Autor ManuelBermudez
  • Fecha de inicio Fecha de inicio
ManuelBermudez

ManuelBermudez

Alfa
Verificación en dos pasos activada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
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.
 
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
 
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.
 
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.
 
Atrás
Arriba