我一直在为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服务器。
感谢您的帮助!