7
votes

php shell_exec avec mise à jour en temps réel

J'ai ce programme Shell que je veux exécuter par PHP. Le problème est que cela peut potentiellement prendre beaucoup de temps et, à ce jour, j'en ai besoin d'avoir une mise à jour en temps réel sur le navigateur de l'utilisateur.

J'ai lu que je devrais peut-être utiliser Popen () pour le faire, mais je suis en quelque sorte (ok, je suis vraiment: p) un PHP noob et ne peut pas comprendre comment je pourrais peut-être le faire.

apprécierait toute aide!


0 commentaires

5 Réponses :


17
votes
if( ($fp = popen("your command", "r")) ) {
    while( !feof($fp) ){
        echo fread($fp, 1024);
        flush(); // you have to flush buffer
    }
    fclose($fp);
}

1 commentaires

Pourquoi devez-vous rincer le tampon?



2
votes

Il y a deux comportements possibles:

  1. non block, où vous devez faire quelque chose d'autre entre Flushs (@gamebit Montrer comment le faire).

  2. avec bloc, où vous attendez la fin de la commande appelée, regardez fonction de passhanlu


3 commentaires

Comment ferais-je le faire avec PassThru? De plus, y a-t-il un inconvénient d'utiliser le code de @ Gamebit si je n'ai rien à faire entre les flushes?


Vous passez la même commande que dans la solution avec popen, mais la sortie du programme externe passe directement à la sortie ... Si vous connaissez la différence entre Fopen et ReadFile, est pratiquement la même chose, uniquement avec des processus. Vous permettez d'abord de lire des octets par octet et de mettre dans une variable, de traiter les données, une autre lecture simple et écrire à la sortie directement, sans aucune action.


J'ai compris. Est en fait plus facile à utiliser. Obrigado! :RÉ



-1
votes

Essayez ce code (Testé sur Windows Machine + Wamp Server)

        header('Content-Encoding: none;');

        set_time_limit(0);

        $handle = popen("<<< Your Shell Command >>>", "r");

        if (ob_get_level() == 0) 
            ob_start();

        while(!feof($handle)) {

            $buffer = fgets($handle);
            $buffer = trim(htmlspecialchars($buffer));

            echo $buffer . "<br />";
            echo str_pad('', 4096);    

            ob_flush();
            flush();
            sleep(1);
        }

        pclose($handle);
        ob_end_flush();


0 commentaires

3
votes

Il existe une option sale facile xxx

redirigeant le stdouté vers STDERR.


0 commentaires

0
votes

J'ai utilisé cette solution. Cela fonctionne bien pour moi. XXX


0 commentaires