从PHP执行的Bash脚本实时输出

时间:2017-02-27 11:04:40

标签: php bash shell shell-exec

我试图从php执行bash脚本并实时获取其输出。

我正在应用here找到的答案:

然而他们不适合我。

当我以这种方式调用.sh脚本时,它可以正常工作:

<?php
  $output = shell_exec("./test.sh");
  echo "<pre>$output</pre>";
?>

然而,在做的时候:

<?php
  echo '<pre>';
  passthru(./test.sh);
  echo '</pre>';
?>

或:

<?php
  while (@ ob_end_flush()); // end all output buffers if any
  $proc = popen(./test.sh, 'r');
  echo '<pre>';
  while (!feof($proc))
    {
    echo fread($proc, 4096);
    @ flush();
    }
  echo '</pre>';
?>

我的浏览器中没有输出。

我也试图在两种情况下调用变量而不是脚本,我的意思是:

<?php
  $output = shell_exec("./test.sh");
  echo '<pre>';
  passthru($output);
  echo '</pre>';
?>

这是我的test.sh脚本:

#!/bin/bash
whoami
sleep 3
dmesg

1 个答案:

答案 0 :(得分:3)

使用以下内容:

<?php
ob_implicit_flush(true);
ob_end_flush();

$cmd = "bash /path/to/test.sh";

$descriptorspec = array(
   0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
   2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);


$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());

if (is_resource($process)) {

    while ($s = fgets($pipes[1])) {
        print $s;

    }
}

?>

将test.sh更改为:

#!/bin/bash
whoami
sleep 3
ls /

<强>解释

dmesg需要权限。您需要为此授予webserver的用户权限。在我的情况下,apache2正在通过www-data用户运行。

ob_implicit_flush(true):打开隐式刷新。每次输出调用后,隐式刷新都会导致刷新操作,因此不再需要显式调用flush()

ob_end_flush():关闭输出缓冲,因此我们立即看到结果。