GNU/Linux >> Znalost Linux >  >> Linux

Spusťte proces s výstupem v reálném čase v PHP

Toto fungovalo pro 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>";

Toto je pěkný způsob, jak zobrazit výstup příkazů shellu v reálném čase:

<?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);

Tuto funkci budete potřebovat, abyste zabránili ukládání do vyrovnávací paměti výstupu:

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');
    }
}

Nefunguje to na každém serveru, na kterém jsem to zkoušel, rád bych vám mohl nabídnout radu, co hledat ve vaší konfiguraci php, abyste zjistili, zda byste si měli nebo neměli trhat vlasy při pokusu o fungování tohoto typu chování na vašem serveru! Ví ještě někdo?

Zde je fiktivní příklad v prostém PHP:

<?php
header("Content-type: text/plain");

disable_ob();

for($i=0;$i<10;$i++) 
{
    echo $i . "\n";
    usleep(300000);
}

Doufám, že to pomůže ostatním, kteří se sem dostali pomocí google.


Linux
  1. Vim:Vytvořit soubor pomocí +x Bit?

  2. Barvení výstupu ocasu pomocí Sed?

  3. Čas zahájení procesu s časovým pásmem?

  1. Jak spustit proces Rsync na pozadí

  2. Spusťte php skript jako proces démona

  3. Jak grep ps výstup s hlavičkami

  1. Spustit skutečné vícenásobné procesní instance terminálu Gnome?

  2. Přesměrování výstupu subshell do procesu?

  3. Spustit skript s argumenty jako uživatel?