Solución:
Esto funcionó para mí:
$cmd = "ping 127.0.0.1";
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
Esta es una buena forma de mostrar la salida en tiempo real de sus comandos de shell:
<?php
header("Content-type: text/plain");
// tell php to automatically flush after every output
// including lines of output produced by shell commands
disable_ob();
$command = 'rsync -avz /your/directory1 /your/directory2';
system($command);
Necesitará esta función para evitar el almacenamiento en búfer de salida:
function disable_ob() {
// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
// Clear, and turn off output buffering
while (ob_get_level() > 0) {
// Get the curent level
$level = ob_get_level();
// End the buffering
ob_end_clean();
// If the current level has not changed, abort
if (ob_get_level() == $level) break;
}
// Disable apache output buffering/compression
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', '1');
apache_setenv('dont-vary', '1');
}
}
Sin embargo, no funciona en todos los servidores en los que lo he probado, me gustaría poder ofrecer consejos sobre qué buscar en su configuración de php para determinar si debe o no tirarse de los pelos para que este tipo de comportamiento funcione. en su servidor! ¿Alguien más lo sabe?
Aquí hay un ejemplo ficticio en PHP simple:
<?php
header("Content-type: text/plain");
disable_ob();
for($i=0;$i<10;$i++)
{
echo $i . "n";
usleep(300000);
}
Espero que esto ayude a otros que han buscado en Google su camino aquí.
Marcó todas las respuestas, nada funciona …
Solución encontrada aquí
Funciona en Windows (creo que esta respuesta es útil para los usuarios que buscan allí)
<?php
$a = popen('ping www.google.com', 'r');
while($b = fgets($a, 2048)) {
echo $b."<br>n";
ob_flush();flush();
}
pclose($a);
?>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)