Maestros de la web vengo a buscar su consejo:
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:
<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>
Programa 2: (upload.php)
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>";