PHP cli脚本中shell命令的输出

PHP cli脚本中shell命令的输出,php,command-line-interface,Php,Command Line Interface,如何实时输出从php执行的shell脚本的内容 假设我从scriptB调用scriptA;如何在脚本完成之前输出脚本的结果 脚本A: <?php for ($i = 0; $i < 10000; $i++) { echo $i; sleep(1); } 答案出人意料地复杂。您不需要使用exec而需要查看proc\u open 这对我很有用: <?php ob_implicit_flush(); $command = "php /path/to/scriptA";

如何实时输出从php执行的shell脚本的内容

假设我从scriptB调用scriptA;如何在脚本完成之前输出脚本的结果

脚本A:

<?php
for ($i = 0; $i < 10000; $i++) {
  echo $i;
  sleep(1);
}

答案出人意料地复杂。您不需要使用
exec
而需要查看
proc\u open

这对我很有用:

<?php
ob_implicit_flush();

$command = "php /path/to/scriptA";

$descriptors = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w")
);

$pipes = [];
$process = proc_open($command, $descriptors, $pipes, dirname(__SCRIPT__), []);
if (is_resource($process)) {
  $char = '';
  while (($char = fgetc($pipes[1])) !== false) {
    echo $char;
    flush();
  }

  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
}

我抑制了它们,因为我得到了
PHP通知:ob_end_flush():删除和刷新缓冲区失败。没有缓冲区来删除或刷新警告,但我刚刚意识到我不需要黑客攻击。
<?php
ob_implicit_flush();

$command = "php /path/to/scriptA";

$descriptors = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w")
);

$pipes = [];
$process = proc_open($command, $descriptors, $pipes, dirname(__SCRIPT__), []);
if (is_resource($process)) {
  $char = '';
  while (($char = fgetc($pipes[1])) !== false) {
    echo $char;
    flush();
  }

  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
}