elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Problema con la carga de fichero csv
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con la carga de fichero csv  (Leído 2,914 veces)
yoelrodguez

Desconectado Desconectado

Mensajes: 167


Es mejor, una amarga verdad que una dulce mentira


Ver Perfil WWW
Problema con la carga de fichero csv
« 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++;
            }
        }
    }


En línea

el-brujo
ehn
***
Desconectado Desconectado

Mensajes: 21.580


La libertad no se suplica, se conquista


Ver Perfil WWW
Re: Problema con la carga de fichero csv
« Respuesta #1 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.


En línea

yoelrodguez

Desconectado Desconectado

Mensajes: 167


Es mejor, una amarga verdad que una dulce mentira


Ver Perfil WWW
Re: Problema con la carga de fichero csv
« Respuesta #2 en: 18 Noviembre 2020, 18:54 pm »

Hola muchas gracias por contestar pruebo y le comento
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Problema] No se me carga Todo al arrancar
GNU/Linux
O-LLOS-O 2 2,228 Último mensaje 20 Agosto 2010, 05:50 am
por luinuz
problema con escrbir fichero
Programación C/C++
flony 6 4,228 Último mensaje 9 Febrero 2013, 21:24 pm
por leosansan
Problema con Backtrack5, no carga.
GNU/Linux
Tristalle 3 2,313 Último mensaje 1 Marzo 2013, 21:02 pm
por ^^BlacK_MesA^^
Problema lectura fichero
Java
Thryks 2 2,137 Último mensaje 14 Marzo 2014, 16:48 pm
por 1mpuls0
Problema con fichero y CreateFileMapping
Programación C/C++
darsy2001 3 2,124 Último mensaje 4 Diciembre 2015, 18:54 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines