Pregunta

quick question really.

Consider the following code:

//__/var/test/cli_test.php__
$x = 0;
while ($x < 9){
  print "loop " . str_pad($x, 3, "0", STR_PAD_LEFT) . "\n";
  sleep(1);
  $x++;
}

if I type php /var/test/cli_test.php in the command line I get 9 interspaced-by-time lines.. i.e. 9 positive outputs, one per second. EG: these arrive one at a time, blip blip blip...

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

now consider a different proposition

//__/var/test/cli_test_shell.php
print shell_exec("php /var/test/cli_test.php");

if I type php /var/test/cli_test_shell.php in the command line I get nothing for 9 seconds then everything arrives.. i.e. 1 BIG output 1 BIG wait. after 9 seconds of nothing EG: wait, wait wait.. nothing THEN DUMP:

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

how can I alter /var/test/cli_test_shell.php so that the output returns each line on per second

¿Fue útil?

Solución

try this:

$handle = popen('php /var/test/cli_test_shell.php 2>&1', 'r');
while (!feof($handle)) {
  echo fread($handle, 8192);
}
fclose($handle);

Otros consejos

The desired behaviour is not possible using shell_exec(). This is because the function collects the output of the command and returns it as a string - after the command's termination. Use passthru() instead and keep cli_test.php as it is.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top