使用PHP / Ajax将实时iPerf输出打印为HTML

时间:2017-10-04 12:59:42

标签: javascript php html ajax iperf

我一直在为iPerf开发一个Web界面,而且一切都很顺利。我的目标是让命令的输出在页面上实时流式传输。它适用于iPerf2命令但是当我运行iPerf3时,它只在整个测试完成后显示输出。

根据我的研究,我在这个网站和其他网站上做过,我认为它可能与缓冲区有关。我一直在搞乱在不同时间刷新缓冲区或将'fread'长度设置为不同的值,但我不能让它与常规的iperf命令相同。我认为这是因为我没有在iperf命令本身上运行'popen',而是在运行iperf命令的python脚本上使用了popen。这仍然返回了同样的问题。只有在整个测试完成后,它才会显示网页上的输出。

这是我的代码:

phpQ.php

<!DOCTYPE html>
<html>
<body>

    <div>
        Server Domain/IP Address: <input id="address" type="text"><br>
        <input id="run" type="button" value="iPerf"><br><br>
    </div>
    <div id="result"></div>
    <script>
        function updateText(address) {
            var ajax = new XMLHttpRequest();

              ajax.onreadystatechange = function() {
                if (this.readyState == 3) {
                  var old_value = document.getElementById("result").innerHTML; 
                  document.getElementById("result").innerHTML = this.responseText;
                }               
            };

            if (purpose == 1) {
                var url = 'ajaxQ.php?address='+address;
                ajax.open('GET', url,true);
                ajax.send();
            }    
        }

        document.getElementById("run").onclick = function(){
            address = document.getElementById("address").value;
            purpose = 1;
            updateText(address);
        }

    </script>
</body>
</html>

ajaxQ.php - 要查看差异,请在$ iperfCmd变量中将“iperf -c”更改为“iperf3 -c”。

<?php

function liveExecuteCommand($cmd,$address)
{
    while (@ ob_end_flush()); // end all output buffers if any

         // tells the user what command is going to run
    echo "<pre>Running Command: '".$cmd."'</pre>";
   
        // open the command to run and read output 
    $proc = popen("$cmd", 'r');
    $live_output     = "";
    $complete_output = "";

    while (!feof($proc))
    {
        @ flush();
        $live_output     = fread($proc,4096);
            // adds the live output to the complete output 
        $complete_output = $complete_output . $live_output;
            // prints the live output 
        echo "<pre>$live_output</pre>";

    }
    sleep(1);
        // close the process 
    pclose($proc);
    echo "<pre>------------------------------------------------------------\nAll Done!</pre>";
}
    // this happens if the iPerf button is pressed
if (isset($_GET['address'])) {
    $address =  $_GET['address'];
    $iperfCmd = "iperf -c ".$address." -i 1 -t 5";
    liveExecuteCommand($iperfCmd,$address);
} 

else{
    echo "No post request";
}

?>

仅供参考,我在“Ubuntu 16.04.2 LTS”CLI服务器上运行iperf客户端,在“Ubuntu 16.04 LTS”桌面服务器上运行iperf服务器。

感谢您的帮助!

0 个答案:

没有答案