GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Führen Sie den Prozess mit Echtzeitausgabe in PHP aus

Das hat bei mir funktioniert:

$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>";

Dies ist eine nette Möglichkeit, die Echtzeitausgabe Ihrer Shell-Befehle anzuzeigen:

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

Sie benötigen diese Funktion, um das Puffern der Ausgabe zu verhindern:

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

Es funktioniert jedoch nicht auf jedem Server, auf dem ich es ausprobiert habe. Ich wünschte, ich könnte Ihnen Ratschläge geben, wonach Sie in Ihrer PHP-Konfiguration suchen müssen, um festzustellen, ob Sie sich die Haare raufen sollten, um zu versuchen, diese Art von Verhalten zum Laufen zu bringen auf Ihrem Server! Kennt das noch jemand?

Hier ist ein Dummy-Beispiel in reinem PHP:

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

disable_ob();

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

Ich hoffe, das hilft anderen, die sich hierher gegoogelt haben.


Linux
  1. Führen Sie echte mehrere Prozessinstanzen von Gnome-Terminal aus?

  2. Vim:Datei mit +x Bit erstellen?

  3. Umleiten einer Ausgabe einer Subshell zu einem Prozess?

  4. Prozessstartzeit mit Zeitzone?

  5. Wie führe ich mehrere PHP-Versionen mit Nginx unter Ubuntu aus?

Führen Sie Windows-Anwendungen unter Linux mit Crossover 15 aus

Killall-Befehl in Linux mit Beispielen

Entrümpeln des Prozessmanagements mit ps oder systemd

So führen Sie ein Python-Skript in PHP aus

So führen Sie einen Alias ​​mit Sudo in Linux aus

So konfigurieren Sie PHP-FPM mit NGINX