PHP读取shell_exec的实时输出

我只是在我的Linux服务器上试验PHP和shell_exec 。 这是一个非常酷的function,我真的很喜欢它。 有没有办法查看命令运行时正在进行的实时输出?

例如,如果ping stackoverflow.com运行,而它正在ping目标地址,每次ping它,用PHP显示结果? 那可能吗?

我很想看到缓冲区正在运行的实时更新。 也许这是不可能的,但它肯定会很好。

这是我正在尝试的代码,我试过的每一个方法总是在命令完成后显示结果。

 <?php $cmd = 'ping -c 10 127.0.0.1'; $output = shell_exec($cmd); echo "<pre>$output</pre>"; ?> 

我试图把echo部分放在一个循环中,但仍然没有运气。 任何人有任何build议,使其显示在屏幕上的实时输出,而不是等待命令完成?

我已经尝试过execshell_execsystempassthru 。 每个人都完成后显示的内容。 除非我使用错误的语法,或者我没有正确设置循环。

要读取进程的输出, popen()是要走的路。 您的脚本将与程序并行运行,您可以通过读取和写入输出/input来进行交互,就像它是一个文件一样。

但是,如果你只是想直接把结果转储给用户,你可以减less废话并使用passthru()

 echo '<pre>'; passthru($cmd); echo '</pre>'; 

现在如果你想在程序运行时显示输出,你可以这样做:

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

该代码应运行该命令,并在运行时将输出直接推送给最终用户。

首先,感谢Havenard为您的片段 – 它帮助了很多!

Havenard的代码的一个稍微修改版本,我觉得有用。

 <?php /** * Execute the given command by displaying console output live to the user. * @param string cmd : command to be executed * @return array exit_status : exit status of the executed command * output : console output of the executed command */ function liveExecuteCommand($cmd) { while (@ ob_end_flush()); // end all output buffers if any $proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r'); $live_output = ""; $complete_output = ""; while (!feof($proc)) { $live_output = fread($proc, 4096); $complete_output = $complete_output . $live_output; echo "$live_output"; @ flush(); } pclose($proc); // get exit status preg_match('/[0-9]+$/', $complete_output, $matches); // return exit status and intended output return array ( 'exit_status' => intval($matches[0]), 'output' => str_replace("Exit status : " . $matches[0], '', $complete_output) ); } ?> 

样本用法:

 $result = liveExecuteCommand('ls -la'); if($result['exit_status'] === 0){ // do something if command execution succeeds } else { // do something on failure }