PHP cli脚本中shell命令的输出
如何实时输出从php执行的shell脚本的内容 假设我从scriptB调用scriptA;如何在脚本完成之前输出脚本的结果 脚本A: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
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]);
}