Tengo algún tiempo trabajando con PHP y AJAX pero no he podido resolver este inconveniente. El problema es el siguiente:
"Procesar un conjunto de archivos con PHP guardados localmente usando AJAX".
Para ello he hecho lo siguiente:
Leer a punta de Javascript archivos almacenados localmente, los archivos tienen la siguiente estructura: W[entero desde 0 hasta cierto valor]P[entero desde 0 hasta cierto valor].RSM. Por ejemplo: W0P0.RSM , W0P1 , W0P2 , W0P3..... W0P1600 luego W1P0, W1P1, W1P2..... W1P1600 (esto se obtiene fácil con dos ciclos for).
La lectura se hace por el momento con un control ActiveX, luego tomo el contenido del archivo por una variable.
Código:
por otro lado tengo el PHP que genera la respuesta: pruebalectura.phpfunction nuevoAjax() { /* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por lo que se puede copiar tal como esta aqui */ var xmlhttp=false; try { // Creacion del objeto AJAX para navegadores no IE xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { // Creacion del objet AJAX para IE xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } catch(E) { if (!xmlhttp && typeof XMLHttpRequest!='undefined') xmlhttp=new XMLHttpRequest(); } } return xmlhttp; } function ReadFile(target) { BRateMin=Number(document.formulario.txMinFondo.value); BRateMax=Number(document.formulario.txMaxFondo.value); URateMin=Number(document.formulario.txMinCSuperior.value); URateMax=Number(document.formulario.txMaxCSuperior.value); BStep=Number(document.formulario.txIncrementoFondo.value); UStep=Number(document.formulario.txIncrementoCSuperior.value); BRateStep= Number((BRateMax - BRateMin) / BStep); URateStep= Number((URateMax - URateMin) / UStep); var fso, strArchivo; ForReading = 1; Ruta= "D:\\Docs\\proyectos\\pruebas\\dataRSM\\"; fso = new ActiveXObject("Scripting.FileSystemObject"); ajax = nuevoAjax(); divObj= document.getElementById(target); divObj.innerHTML="Hora comienzo: "+Date()+"<br>"; for(i=BRateMin; i<=BRateMax; i+=BRateStep){ for(j=URateMin; j<=URateMax; j+=URateStep){ f = fso.OpenTextFile(Ruta+"W"+ i +"P"+ i +".RSM", ForReading); strArchivo=f.ReadAll(); ajax.open("POST", "pruebalectura.php?accion=leerarchivo", true); ajax.onreadystatechange=function() { if (ajax.readyState==1) divObj.innerHTML+="Cargando...<br>"; if (ajax.readyState==4) { //Procesamiento AJAX de lectura de archivo resultLectura = ajax.responseText; if(resultLectura=='0'){ divObj.innerHTML+="Fallido...<br>"; return 0; } else{ divObj.innerHTML+="Exito...Archivo: W"+ i +"P"+ i +".RSM" +" leído por PHP<br>" divObj.innerHTML+="Archivo leído?: "+resultLectura; f.Close(); } } } ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); ajax.send("strArchivo="+strArchivo); } } }
Código PHP:
include("../lib/procesadorRSM.php");
if(isset($_POST["strArchivo"]) && !empty($_POST["strArchivo"])){
//Pasos para leer el archivo, blah blah blah
if(procesarArchivo($_POST["strArchivo"]))
echo "1"; //Exito
else
echo "0"; //no se pudo procesar
}
Lo que está sucediendo es que cuando mando a ejecutar Readfile y se mete en los ciclos FOR se pone a leer los archivos, luego paso al procesamiento con AJAX pero este procesamiento puede tarda un poco, sin embargo, el ciclo FOR debe continuar y no deja que la funcionalidad AJAX se ejecute (se limita a mostrar Cargando..), por consiguiente lo que estoy obteniendo como salida es:
Código HTML:
. . . Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Cargando... Exito...Archivo: W4100P4100.RSM leído Archivo leído?: 1
La idea es que procese cada archivo diciendo: "Exito...", por lo tanto debería salir algo así línea por línea:
Código HTML:
. . . Cargando... Exito...Archivo: W4100P4196.RSM leído Cargando... Exito...Archivo: W4100P4197.RSM leído Cargando... Exito...Archivo: W4100P4198.RSM leído Cargando... Exito...Archivo: W4100P4199.RSM leído Cargando... Exito...Archivo: W4100P4100.RSM leído
Espero haberme explicado bien.
Gracias de antemano por la ayuda.