Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/12/2009, 07:05
serbarmax
 
Fecha de Ingreso: enero-2003
Mensajes: 120
Antigüedad: 21 años, 4 meses
Puntos: 0
Pregunta Barra progreso en proceso como hacerlo?

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>";
__________________
Sergio.