GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecutar proceso con salida en tiempo real en PHP

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 manera 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 quitarse los pelos tratando de hacer que este tipo de comportamiento funcione. en su servidor! ¿Alguien más 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 hasta aquí.


Linux
  1. ¿Ejecutar verdaderas instancias de múltiples procesos de Gnome-terminal?

  2. ¿Cómo ejecutar varias versiones de PHP con Nginx en Ubuntu?

  3. Cómo grep con salida de color

  4. Cómo ejecutar el proceso Rsync en segundo plano

  5. Cómo grep salida ps con encabezados

Ejecute aplicaciones de Windows en Linux con Crossover 15

Comando Killall en Linux con ejemplos

Ordenar la gestión de procesos con ps o systemd

Cómo ejecutar un script de Python en PHP

Cómo ejecutar un alias con Sudo en Linux

Cómo configurar PHP-FPM con NGINX