Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: yoelrodguez en 18 Noviembre 2020, 17:04 pm



Título: Problema con la carga de fichero csv
Publicado por: yoelrodguez en 18 Noviembre 2020, 17:04 pm
Hola, tengo la siguiente situación. Estoy subiendo un fichero a mi servidor .csv de 15000 registro, separados por coma., El procesos de insertar los datos en la base de datos, lo estoy haciendo con insert en grupos de 100 para agilizar el proceso de la carga del fichero. Durante el proceso de conformación del mi query insert hago varias consultas a la base de datos. El problema que estoy teniendo es el siguiente: en mi servidor de desarrollo local que es un XAMPP con php 7.2 y mariadb ejecutando sobre linux mint se me demora 30 min pero en mi servidor online que es una vps con debian 10 php 7.2 y mariadb se puede demorar hasta 3 horas, provocándome errores a la hora de realizar el insert, que se traducen en valores que se muestran en cero o vacíos.

Mi pregunta es la siguiente como puedo ver la causa de la demora el el servidor ya que no me arroja ningún error ni en pantalla ni en los log.

Gracias

Código:
//Funcion para importar los pagos.
    public function set_importpaymet($files)
    {
        $idinsured = input_post('insured');
        $fecha = fecha_format(input_post('fecha'), "m-d-Y");
        $i = 1;
        $a_fecha = explode("-", input_post('fecha'));
        $mes = $a_fecha[0];
        $year = $a_fecha[2];
        $aPos = $_POST['campodata'];
        //Posision de los campos.
        $ia = ($aPos[0] != 0) ? $aPos[0] - 1 : '';
        $ic = ($aPos[1] != 0) ? $aPos[1] - 1 : '';
        $icl = ($aPos[2] != 0) ? $aPos[2] - 1 : '';
        $is = ($aPos[3] != 0) ? $aPos[3] - 1 : '';
        $ip = ($aPos[4] != 0) ? $aPos[4] - 1 : '';
        $ie = ($aPos[5] != 0) ? $aPos[5] - 1 : '';
        $imth = ($aPos[6] != 0) ? $aPos[6] - 1 : '';
        $im = ($aPos[7] != 0) ? $aPos[7] - 1 : '';
        $ir = ($aPos[8] != 0) ? $aPos[8] - 1 : '';
        $ico = ($aPos[9] != 0) ? $aPos[9] - 1 : '';
        $inr = ($aPos[10] != 0) ? $aPos[10] - 1 : '';
        $icd = ($aPos[11] != 0) ? $aPos[11] - 1 : '';
 
        switch ($mes) {
            case '01':
                $cmes = 'january';
                break;
            case '02':
                $cmes = 'february';
                break;
            case '03':
                $cmes = 'march';
                break;
            case '04':
                $cmes = 'april';
                break;
            case '05':
                $cmes = 'may';
                break;
            case '06':
                $cmes = 'june';
                break;
            case '07':
                $cmes = 'july';
                break;
            case '08':
                $cmes = 'august';
                break;
            case '09':
                $cmes = 'september';
                break;
            case '10':
                $cmes = 'october';
                break;
            case '11':
                $cmes = 'november';
                break;
            case '12':
                $cmes = 'dicember';
                break;
        }
        $numLineas = (count(file("storage/" . $files))) / 100;
 
        if (!is_int($numLineas)) {
            $numLineas = intval($numLineas) + 1;
        }
        $Resto = (count(file("storage/" . $files))) % 100;
        //Comensamos a procesar el fichero.
        $v = 1;
        $c = 1;
        $cil = 1;
        if (($gestor = fopen("storage/" . $files, "r")) !== false) {
            while (($datos = fgetcsv($gestor, 1000, ",")) == true) {
                if ($c != 1) {
 
                    if ($v == 100 and $cil <= $numLineas) {
                        $campos = "(npn,month,subcriberid,member,fecha,id_incured,effectivedate,procedado,class,com_paym)";
                        $valores = substr($valores, 0, -1);
                        $q = $this->db->multi_query("INSERT INTO tabla2" . $campos . " VALUES " . $valores);
                        if (!$q) {
                            echo "INSERT INTO tabla2 " . $campos . " VALUES " . $valores . "<br />";
                            printf("Error en ejecución: %s\n", $this->db->error);
                        }
                        $campos1 = "(a_number,c_name,p_state,p_number,e_date,month,pyear,n_member,rate,commission,new_ren,id_insured)";
                        $valores1 = substr($valores1, 0, -1);
                        $q1 = $this->db->multi_query("INSERT INTO tabla1" . $campos1 . " VALUES " . $valores1);
                        if (!$q1) {
                            echo "INSERT INTO tabla1 " . $campos1 . " VALUES " . $valores1 . "<br />";
                            printf("Error en ejecución: %s\n", $this->db->error);
                        }
                        $valores = '';
                        $valores1 = '';
                        $cil++;
                        $v = 0;
                    }
                    //Proceamos el nombre para el caso que venga invertido.
                    if (strpos($datos[$ic], ',')) {
                        $aName = explode(",", $datos[$ic]);
                        $clientName = $aName[1] . " " . $aName[0];
                    } else {
                        $apellido = $datos[$icl];
                        $clientName = $datos[$ic] . " " . $apellido;
                    }
                    unset($com);
                    $pos = strpos($datos[$ip], "-");
                    if ($idinsured == 1) {
                        $aSub = explode("-", $datos[$ip]);
                        $subId = $aSub[1];
                    } else {
                        $subId = trim($datos[$ip]);
                    }
                    //$subId = str_replace("FL-","",trim($datos[$ip]));
                    //Definimos el formato de la fecha
                    $fechaFile = fecha_format(str_replace("/", "-", $datos[$ie]), "m-d-Y");
 
                    //Insertamos los gagos para el bob list de amberer.
                    $comision = str_replace(array("$"), "", $datos[$ico]);
 
                    $valores1 .= "(";
                    $valores1 .= "'" . addslashes($datos[$ia]) . "',";
                    $valores1 .= "'" . addslashes($clientName) . "',";
                    $valores1 .= "'" . addslashes($datos[$is]) . "',";
                    $valores1 .= "'" . addslashes($subId) . "',";
                    $valores1 .= "'" . addslashes($fechaFile) . "',";
                    $valores1 .= "'" . $mes . "',";
                    $valores1 .= "'" . $year . "',";
                    $valores1 .= "'" . intval($datos[$im]) . "',";
                    $valores1 .= "'" . addslashes(str_replace(array("$"), "", $datos[$ir])) . "',";
                    $valores1 .= "'" . floatval($comision) . "',";
                    $valores1 .= "'" . addslashes($datos[$inr]) . "',";
                    $valores1 .= "'" . $idinsured . "'";
                    $valores1 .= "),";
 
                        $q = $this->db->query("SELECT id, id_agent FROM `tabla5` WHERE suscriberid = '" . $subId . "'  AND id_insured = '" . $idinsured . "' AND SUBSTRING(aplication_date, 1, 4) = '" . $year . "' AND  borrado <> 1 AND pending <> 1 ");
 
                    //Comprobamos a quien pertenece el pago y la comicion del agente por subcriber o nombre.
                    if ($q->num_rows == 1) {
                        $obj = $q->fetch_object();
                        //Traemos el valor de la comision que se le va pagar por agent.
                        $qac = $this->db->query("SELECT comm_new, comm_rew FROM tabla4 WHERE id_agent = '" . $obj->id_agent . "' AND id_insured = '" . $idinsured . "' AND yearcom = '" . $year . "' ");
                        if ($qac->num_rows > 0) {
                            $obj_cag = $qac->fetch_object();
                            //Calculamos la comision para insertar el valor en la tabla de pagos.
                            if ($datos[$inr] == 'OEP') {
                                $com = $obj_cag->comm_new * intval($datos[$im]);
                            } else {
                                $com = $obj_cag->comm_rew * intval($datos[$im]);
                            }
                            //Comprovamos si el usuario ya tiene pago
                            $qc = $this->db->query("SELECT ". $cmes . " FROM tabla3 WHERE id_client = '" . $obj->id . "' AND fecha = '" . $year . "'");
                            if ($qc->num_rows > 0) {
 
                                $obj_cmes = $qc->fetch_object();
                                $comp = $com + $obj_cmes->$cmes;
                                //Insertamos el registro procesado en la tabla registro.
                                $valores .= "(";
                                $valores .= "'" . addslashes($datos[$ia]) . "',";
                                $valores .= "'" . addslashes($datos[$imth]) . "',";
                                $valores .= "'" . $subId . "',";
                                $valores .= "'" . addslashes($datos[$im]) . "',";
                                $valores .= "'" . addslashes($fecha) . "',";
                                $valores .= "'" . $idinsured . "',";
                                $valores .= "'" . addslashes($fechaFile) . "',";
                                $valores .= "'1',";
                                $valores .= "'" . addslashes($datos[$inr]) . "',";
                                $valores .= "'" . $com . "'";
                                $valores .= "),";
                                //Insertamos los datos en la tabla de pagos al  mes que coresponde.
                                classDb::update_db(tabla3, array($cmes => $comp), array('id_agent' => $obj->id_agent, 'id_client' => $obj->id, 'fecha' => $year));
                            } else {
 
                                //Insertamos el registro procesado en la tabla registro.
                                $valores .= "(";
                                $valores .= "'" . addslashes($datos[$ia]) . "',";
                                $valores .= "'" . addslashes($datos[$imth]) . "',";
                                $valores .= "'" . $subId . "',";
                                $valores .= "'" . addslashes($datos[$im]) . "',";
                                $valores .= "'" . addslashes($fecha) . "',";
                                $valores .= "'" . $idinsured . "',";
                                $valores .= "'" . addslashes($fechaFile) . "',";
                                $valores .= "'0',";
                                $valores .= "'" . addslashes($datos[$inr]) . "',";
                                $valores .= "'0'";
                                $valores .= "),";
                            }
                            $qc->free();
                        } else {
 
                            //Insertamos el registro procesado en la tabla registro.
                            $valores .= "(";
                            $valores .= "'" . addslashes($datos[$ia]) . "',";
                            $valores .= "'" . addslashes($datos[$imth]) . "',";
                            $valores .= "'" . $subId . "',";
                            $valores .= "'" . addslashes($datos[$im]) . "',";
                            $valores .= "'" . addslashes($fecha) . "',";
                            $valores .= "'" . $idinsured . "',";
                            $valores .= "'" . addslashes($fechaFile) . "',";
                            $valores .= "'0',";
                            $valores .= "'" . addslashes($datos[$inr]) . "',";
                            $valores .= "'0'";
                            $valores .= "),";
                        }
                        $qac->free();
                    } else {
 
                        //Insertamos el registro procesado en la tabla registro.
                        $valores .= "(";
                        $valores .= "'" . addslashes($datos[$ia]) . "',";
                        $valores .= "'" . addslashes($datos[$imth]) . "',";
                        $valores .= "'" . $subId . "',";
                        $valores .= "'" . addslashes($datos[$im]) . "',";
                        $valores .= "'" . addslashes($fecha) . "',";
                        $valores .= "'" . $idinsured . "',";
                        $valores .= "'" . addslashes($fechaFile) . "',";
                        $valores .= "'0',";
                        $valores .= "'" . addslashes($datos[$inr]) . "',";
                        $valores .= "'0'";
                        $valores .= "),";
                    }
                    $q->free();
 
                    if (($v == $Resto) and ($cil == $numLineas) and ($Resto != 0)) {
                        $campos = "(npn,month,subcriberid,member,fecha,id_incured,effectivedate,procedado,class,com_paym)";
                        $valores = substr($valores, 0, -1);
                        $q = $this->db->multi_query("INSERT INTO tabla1 " . $campos . " VALUES " . $valores);
 
                        if (!$q) {
                            echo "INSERT INTO tabla1 " . $campos . " VALUES " . $valores . "<br />";
                            printf("Error en ejecución: %s\n", $this->db->error);
                        }
 
                        $campos1 = "(a_number,c_name,p_state,p_number,e_date,month,pyear,n_member,rate,commission,new_ren,id_insured)";
                        $valores1 = substr($valores1, 0, -1);
 
                        $q1 = $this->db->multi_query("INSERT INTO tabla2 " . $campos1 . " VALUES " . $valores1);
 
                        if (!$q1) {
                            echo "INSERT INTO tabla2 " . $campos1 . " VALUES " . $valores1 . "<br />";
                            printf("Error en ejecución: %s\n", $this->db->error);
                        }
                        unset($valores);
                        unset($valores1);
                        $v = 0;
                    }
                }
                $v++;
                $c++;
            }
        }
    }


Título: Re: Problema con la carga de fichero csv
Publicado por: el-brujo en 18 Noviembre 2020, 17:15 pm
Mira los logs del php del vps, tiene que haber algún registro en algún lado.

max_execution_time de un script php por defecto son 30 segundos

Citar
en grupos de 100 para agilizar el proceso de la carga del fichero.

Buena idea hacerlo de x registros en x registros.

Pues tendrás que añadir una pausa de x segundos para no sobrecargar y dejar descansar. Porque aunque lo hagas de 100 en 100 si va todo seguido se satura.

En PHP lo puedes hace con

Código
  1.    sleep(10);

El código debe estar bien si funciona en local, pero todo depende del hardware y del software como esté de optimizado. Seguramente tu ordenador es más potente que el VPS que debe andar justito de recursos.


Título: Re: Problema con la carga de fichero csv
Publicado por: yoelrodguez en 18 Noviembre 2020, 18:54 pm
Hola muchas gracias por contestar pruebo y le comento