Salida inmediata en php

Hola. A ver si me puedes ayudar.
Quiero hacer un bucle for que copia archivos de un directorio a otro e imprime en pantalla en cada iteración el path de origen del archivo que esté copiando.
Hasta ahí no tengo problema. El problema es que me interesaba que imprimiese cada linea inmediatamente cuando se produce la copia (es decir, en la ejecución irían apareciendo uno detrás de otro los archivos según se van copiando) y no todos a la vez.
Esto es lo que no consigo que funcione como quiero. Me salen las lineas por montones.
He intentado poner la función flush() en cada iteración del bucle pero el resultado es el mismo.
¿SE te ocurre algo?
Saludos, Recon

4 Respuestas

Respuesta
1
Puff... Me ha costado trabajo resolver tu problema. Por cierto, hola.
He tenido que echar mano de javascript (sólo funcionará con garantías en IE, aunque podríamos hacerlo más general para cualquier navegador "moderno")
Y aunque te parezca extraño, te comento que el comportamiento de flush depende del sistema operativo del servidor y del navegador del cliente. En general, los navegadores almacenan en un buffer la página web y la imprimen cuando la han recibido completa (salvo los ficheros adjuntos: gráficos, sonido,...)
En este código te pongo un ejemplo parecido a lo que quieres, para que lo estudies y lo modifiques para tu caso concreto:
<?php
// path completo del directorio a listar
$origen="path_al_directorio";
// funcion que simula tener embebida una funcion de javascript
function Add($linea) {
echo "<script>\n";
echo "document.all.fisk.innerHTML= document.all.fisk.innerHTML + '$linea' + '<br>'\n";
echo "</script>\n";
}
// funcion que lista los ficheros de un directorio
function getDirList ($dirName) {
$d = dir($dirName);
while($entry = $d->read()) {
if ($entry != "." && $entry != "..") {
if (!is_dir($dirName."/".$entry)) {
// en lugar de echo usamos esta función que implementa una de javascript
// que añade texto al elemento fisk
Add($entry);
}
flush();
sleep(1); // 1 segundo de demora
}
}
$d->close();
}
// espacios vacios para llener el buffer del explorador
print str_repeat(" ", 300) . "\n";
// Definimos el objeto 'fisk' sobre el que vamos a ir escribiendo. Puede ser una capa o una celda de una tabla
echo "<div id='fisk'>Listado<br>";
echo "</div>";
// Lanzamos la función (observa que lo hacemos desde FUERA del objeto fisk)
getDirList($origen);
?>
Bueno, hay tienes tarea para comprobar como va.
Espero que te haya servido, porque no ha sido nada fácil encontrar la solución.
Un saludo. Hasta otra.
Respuesta
1
Ya has probado flush() que sirve para lo que tu necesitas. Pero si no te sirve prueba el siguiente código:
<?php
ob_end_flush();
echo "Linea 1. <br> \n";
flush();
sleep(1);
echo "Linea 2. <br> \n";
?>
Supongo que usando ob_end_flush() no tendrás problemas. También puedes usar ob_flush().
Respuesta
Puede ser problema del servidor. Muchos dejan el contenido en un buffer hasta que termine la ejecución.
Sino puede ser por el Internet Explorer, ya que solo muestran información después de haber recibido 256bytes.
Por eso podes agregar:
<?=(str_repeat(' ',256)."\n")?>
Al comienzo para asegurarte esos 256bytes.
Respuesta
Desafortunadamente no podrás lograr lo que quieres, ya que PHP se ejecuta en el servidor y la salida a pantalla se hace en el navegador del cliente.. por eso no se puede... ya que la salida es enviada al navegador después de que el PHP haya sido procesado..
Sorry...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas