Tengo 3 programas PHP.
1. Form.
2. Upload archivo.
3. Procesamiento del archivo subido.
1. Tiene el formulario para seleccionar un archivo a subir, este es un comprimido de un TXT que se descomprime en el punto 3 antes de ser procesado.
2. llamo a un PHP para que suba el archivo y este llama al tercero para procesar.
3. Descomprime y recorre línea por línea con FOPEN y FGET para separar los campos e insertar en una tabla mysql.
El proceso demora mucho en el hosting y no tengo una barra de progreso que pueda indicarme el porcentaje, probé algunas pero no funcionaron, tal vez porque tengo todo en 3 archivos y debería tenerlo en un solo PHP a todo, es así?
El archivo de textos puede llegar a tener 200.000 renglones.
A veces demora tanto que abandono y corto el proceso puede estar unas horas.
Lo probé localmente la parte de descompresión y proceso, y funciona bien. Monitoreo el proceso desde FTP y el archivo es subido y descomprimido correctamente.
El archivo ZIP puede pesar hasta 2 Mb puro texto.
Dejenme algunas sugerencias de cómo y donde colocar la barra de progreso y buscaré solucionarlo muchas gracias.
Programa 1: form.php
Código:
Programa 2: (upload.php)<form action="upload.php" method="post" enctype="multipart/form-data" name="form1"> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="9000000"><br> <span class="Estilo4">Indique ubicación de <b>detalle.zip</b> a subir (nombre totalmente minúsculas):</span><br> <input type="file" name="archivo" size="40" id="archivo"> <input type="submit" name="boton" value="Enviar"> </form>
Código:
$copiado=move_uploaded_file($foto, "archivos/".$foto_name); $_SESSION["archivo"]=$foto_name; if($copiado==false){ print "error"; die(); }else{ header("Location: importar3.php"); }
Programa 3 (importar3.php)
Código:
function extractZip2( $zipFile = './archivos/detalle.zip', $dirFromZip = './archivos' ) { $archive = new PclZip($zipFile); return ($archive->extract(PCLZIP_OPT_PATH,$dirFromZip) == 0); } $opcion=extractZip2(); $link=mysql_connect("localhost", "usuario", "contraseña", "base"); mysql_select_db("base", $link) or die(mysql_error()); set_time_limit(50000); $insertados=0; $modificados=0; $lectura=fopen("archivos/detalle.txt", "r"); while(!feof($lectura)) { $renglon = fgets($lectura); $renglon=str_replace("'"," ",$renglon); $campos=explode('|', $renglon); // lectura previa para verificar existencia y modificación (update) en caso de que exista $prov=mysql_query("select * from detallef where matricula='".$campos[0]."' and factura='". $campos[1]. "' and registro='".$campos[2]."' and codigo='".$campos[8]."'"); if ($row=mysql_fetch_array($prov)) { // Lectura Exitosa $sql="update detallef set "; $sql.=" matricula= '". $campos[0]."', "; $sql.=" factura= '". $campos[1]."', "; $sql.=" registro= '". $campos[2]."', "; $sql.=" autorizacion= '". $campos[3]."', "; $sql.=" fecha='". $campos[4]."', "; $sql.=" afiliacion='". $campos[5]."', "; $sql.=" apenom='". $campos[6]."', "; $sql.=" numero='". $campos[7]."', "; $sql.=" codigo='". $campos[8]."', "; $sql.=" cantidad='". $campos[9]."', "; $sql.=" importe='". unir( $campos[10])."' "; // se llama a funcion que convierte a números con dos decimales. $sql.=" where matricula='".$campos[0]."' and factura='". $campos[1]. "' and registro='".$campos[2]."' and codigo='".$campos[8]."'"; $result=mysql_query($sql, $link); $modificados=$modificados+1; if (mysql_error()) { echo "Error Update: $sql"; die(); } } // end if lectura exitosa else // lectura exitosa { $insertados=$insertados+1; $sql="INSERT INTO detallef VALUES ('0',"; $sql.="'".$campos[0]."',"; // matrícula $sql.="'".$campos[1]."',"; // factura $sql.="'".$campos[2]."',"; // registro $sql.="'".$campos[3]."',"; // autorizacion $sql.="'".$campos[4]."',"; // fecha $sql.="'".$campos[5]."',"; // afiliacion $sql.="'".$campos[6]."',"; // apenom $sql.="'".$campos[7]."',"; // numero $sql.="'".$campos[8]."',"; // codigo $sql.="'".$campos[9]."',"; // cantidad $sql.="'".unir($campos[10])."')"; // importe se llama a funcion que convierte a números con dos decimales. $result=mysql_query($sql, $link); if (mysql_error()) { echo "Error Insert: $sql"; die(); } } // end else de lectura exitosa } // end while echo "<br><br>Finalizado.<br> Modificados: $modificados<br> Insertados : $insertados<br>";