GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter le processus avec une sortie en temps réel en PHP

Cela a fonctionné pour moi :

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

C'est une bonne façon d'afficher la sortie en temps réel de vos commandes 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);

Vous aurez besoin de cette fonction pour empêcher la mise en mémoire tampon de sortie :

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

Cela ne fonctionne pas sur tous les serveurs sur lesquels je l'ai essayé, j'aimerais pouvoir offrir des conseils sur ce qu'il faut rechercher dans votre configuration php pour déterminer si vous devez ou non vous arracher les cheveux en essayant de faire fonctionner ce type de comportement sur votre serveur ! Quelqu'un d'autre sait-il ?

Voici un exemple factice en PHP simple :

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

disable_ob();

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

J'espère que cela aidera d'autres personnes qui ont cherché sur Google leur chemin ici.


Linux
  1. Exécuter de véritables instances de processus multiples de Gnome-terminal ?

  2. Coloriser la sortie de queue avec Sed ?

  3. Exécuter le script avec des arguments en tant qu'utilisateur ?

  4. Comment exécuter plusieurs versions de PHP avec Nginx sur Ubuntu ?

  5. Comment grep avec la sortie couleur

Exécutez des applications Windows sur Linux avec Crossover 15

Commande Killall sous Linux avec des exemples

Désencombrer la gestion des processus avec ps ou systemd

Comment exécuter un script Python en PHP

Comment exécuter un alias avec Sudo sous Linux

Comment configurer PHP-FPM avec NGINX