长期用户,首次提问。我从社区学到了很多,我喜欢这个网站。
所以这就是我正在拍摄的内容。我希望有一个在后端运行ping命令的Web界面。理想情况下,我希望网站具有允许您输入IP地址或域的文本输入,运行该命令的按钮以及从PHP运行以实际运行ping命令的python脚本。棘手的部分是将输出打印到网站上,因为它是在命令行输出的。我想以这种方式做到这一点,作为一种未来证明概念的方法,并最终使用不同的iperf参数。
我构建了一个“技术上”完成工作的小PHP页面,但我无法弄清楚如何在单击按钮时调用PHP脚本。因为它是一个PHP页面,所以只要加载页面就会运行它。经过一些研究,我认为ajax jquery是我正在寻找的。我花了大约2天的时间尝试不同的东西让我非常接近,但似乎我在我的解决方案中跳舞。
根据我对ajax的了解,我基本上需要一个运行ajax函数的按钮,该函数链接到我正在运行的php脚本。我可以让它运行脚本,但我不能让它以实时/连续的方式更新页面内容。仅在命令运行完毕时。
这是我的php页面,它可以执行它需要做的事情,但每次加载/重新加载页面时都会这样做。不理想。我希望脚本只在按下按钮时运行。
liveping.php:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="liveping.php" id="ping" method="post" name="ping">
Domain/IP Address: <input name="domain" type="text"> <input name="ping" type="submit" value="Ping">
</form><?php
if (isset($_POST['ping'])) {
function liveExecuteCommand($cmd)
{
while (@ ob_end_flush()); // end all output buffers if any
$proc = popen("$cmd 2>&1", 'r');
$live_output = "";
$complete_output = "";
while (!feof($proc))
{
$live_output = fread($proc, 4096);
$complete_output = $complete_output . $live_output;
echo "<pre>$live_output</pre>";
@ flush();
}
pclose($proc);
}
}
$domain = $_POST['domain'];
$pingCmd = "python /var/www/html/ping.py ".$domain;
if (isset($_POST['ping'])) {
liveExecuteCommand($pingCmd);
}
?>
</body>
</html>
ping.py:
#!/usr/bin/python
import cgi
import os
import sys
ping = "ping -c 5 -W 2 "+sys.argv[1]
os.system(ping)
我尝试过的一些事情:
<html>
<head>
<script>
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = setInterval(function() {
if (ajax.readyState == 4) {
document.getElementById('content').innerHTML = ajax.responseText;
}
},100);
function updateText() {
ajax.open('GET', 'ajax.php');
ajax.send();
}
</script>
</head>
<body>
<button onclick="updateText()">Click Me</button>
<div id="content">Nothing here yet.</div>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>
<script type="text/javascript">
var auto_refresh = setInterval(
function ()
{
$('#load_tweets').load('ajax.php').fadeIn("slow");
}, 1000); // refresh every 10000 milliseconds
</script>
</head>
<div id="load_tweets"> </div>
</body>
</html>
使用ajax.php
<?php
while (@ ob_end_flush()); // end all output buffers if any
$proc = popen("ping -c 5 -W 2 google.com", 'r');
$live_output = "";
$complete_output = "";
while (!feof($proc))
{
$live_output = fread($proc, 4096);
$complete_output = $complete_output . $live_output;
echo "<pre>$live_output</pre>";
@ flush();
}
pclose($proc);
?>
感谢您的帮助!
答案 0 :(得分:2)
你不需要python来显示ping结果。只需两个PHP文件即可。
index.php
将具有AJAX功能以及表单。 ajax.php
将拥有ping指定域名地址的代码。 我担心使用jQuery你可能无法捕获实时源。因为它没有任何onreadystatechange
。因此,在这种情况下,您可能需要使用vanilla JavaScript。这是一个工作示范:
<强>的index.php:强>
<!DOCTYPE html>
<html>
<head>
<title>Ping AJAX</title>
</head>
<body>
<div>
Domain/IP Address: <input id="domain" type="text">
<input id="ping" type="button" value="Ping">
</div>
<div id="result"></div>
<script>
function updateText(domain) {
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (this.readyState == 3) {
var old_value = document.getElementById("result").innerHTML;
document.getElementById("result").innerHTML = this.responseText;
}
};
var url = 'ajax.php?domain='+domain;
ajax.open('GET', url,true);
ajax.send();
}
document.getElementById("ping").onclick = function(){
domain = document.getElementById("domain").value;
updateText(domain);
}
</script>
</body>
</html>
<强> ajax.php:强>
<?php
if (isset($_GET['domain'])) {
function liveExecuteCommand($cmd)
{
while (@ ob_end_flush()); // end all output buffers if any
$proc = popen($cmd, 'r');
$live_output = "";
$complete_output = "";
while (!feof($proc))
{
$live_output = fread($proc, 4096);
$complete_output = $complete_output . $live_output;
echo "<pre>$live_output</pre>";
@ flush();
}
pclose($proc);
}
$domain = $_GET['domain'];
$pingCmd = "ping ".$domain;
liveExecuteCommand($pingCmd);
}
else{
echo "No post request";
}
?>
<强>输出:强>
<强> Declaimer:强>
ping命令已更改,因为我当前正在使用Windows操作系统。根据您的操作系统进行更新。
作为第一次提问者,您已经巧妙地描述了问题并且还展示了您为解决问题所做的努力。我真的很感激。
答案 1 :(得分:1)
ajax.readyState == 4
本质上意味着,另一方的脚本已经完成...... 3是部分的。
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState
答案 2 :(得分:1)
您只需将所有ajax脚本放入函数
即可示例:
function updateText() {
$.ajax({
type: 'GET', // can be POST, too
url: "ajax.php",
crossDomain: true,
data: {
firstvar: firstvar,
secondvar: secondvar
},
cache: false,
success: function(data) {
if($.trim(data) == "false") {
alert("Fail to recived data");
}
else {
// Success getting data
// Do some jobs
}
}
});
}
如果你想取消提交到非refesh,你可以使用
return false; // At the end of the function above
希望它有所帮助。