J'ai un problème étrange. J'essaie de contourner la mise en tampon de sortie en PHP pour lancer des appels system() et obtenir une sortie instantanée. Cela fonctionne très bien, mais pour une raison étrange, la commande ping sur "test.de" ne présente pas de sortie instantanée comme le fait le ping sur google.de. Je vois la première ligne pour 'ping test.de' dans le shell linux instantanément, mais elle n'apparaît pas instantanément avec ce script. Quelqu'un peut-il aider?PHP se bloquer avec passthru()/system() appel et la mise en mémoire tampon de sortie
<?php
// 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');
}
header('Cache-Control: no-cache');
$i=0;
while($i < 1000) {
$i++;
echo ' ';
}
echo '<pre>';
echo "Pinging google.de \n\n";
passthru("ping -w 10 -c 4 google.de");
echo "\n\nPinging test.de \n\n";
passthru("ping -w 10 -c 4 test.de");
echo '</pre>';
?>
J'ai marqué la ligne retardée dans cette sortie:
Pinging google.de
PING google.de (172.217.16.131) 56(84) bytes of data.
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=1 ttl=56 time=22.0 ms
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=2 ttl=56 time=22.0 ms
64 bytes from zrh04s06-in-f131.1e100.net (172.217.16.131): icmp_seq=3 ttl=56 time=22.2 ms
64 bytes from zrh04s06-in-f3.1e100.net (172.217.16.131): icmp_seq=4 ttl=56 time=22.0 ms
--- google.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 22.016/22.067/22.200/0.130 ms
Pinging test.de
PING test.de (104.45.6.189) 56(84) bytes of data. <<<< THAT line is delayed!!
--- test.de ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 9999ms
** 'exec()' ** retourne la dernière ligne –
je l'ai déjà essayé 'exec()' et 'passthru()'. exec() ne convient pas pour une sortie directe. passthru() a semblé raisonnable, mais cela n'a pas fonctionné non plus. Il a produit le même délai: -/J'ai aussi essayé popen() et lu l'octet STDOUT par octet, mais cela ne fonctionnait pas non plus. J'ai également essayé d'envoyer la sortie vers un fichier (avec une console détachée) et de faire un appel à system() pour lire le fichier pendant que l'autre processus l'écrit - mais cela n'a pas fonctionné non plus ... Je suis coincé : -/ – xsign
Ajoute une variable '$ output' et affiche l'argument screen après la commande, mettant à jour la réponse avec cette info ... –