Saltar al contenido

Ejecutar proceso con salida en tiempo real en PHP

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *