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议,使其显示在屏幕上的实时输出,而不是等待命令完成?
我已经尝试过exec
, shell_exec
, system
和passthru
。 每个人都完成后显示的内容。 除非我使用错误的语法,或者我没有正确设置循环。
要读取进程的输出, 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 }