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. P>
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. p>
apprécierait toute aide! P>
5 Réponses :
if( ($fp = popen("your command", "r")) ) { while( !feof($fp) ){ echo fread($fp, 1024); flush(); // you have to flush buffer } fclose($fp); }
Pourquoi devez-vous rincer le tampon?
Il y a deux comportements possibles: p>
non block, où vous devez faire quelque chose d'autre entre Flushs (@gamebit Montrer comment le faire). P> LI>
avec bloc, où vous attendez la fin de la commande appelée, regardez fonction de passhanlu p> li> ol>
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É
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();
Il existe une option sale facile redirigeant le stdouté vers STDERR. P> P>
J'ai utilisé cette solution. Cela fonctionne bien pour moi.