使用Ajax从实时PHP和Python输出更新页面内容

时间:2017-09-12 19:48:48

标签: javascript php jquery python ajax

长期用户,首次提问。我从社区学到了很多,我喜欢这个网站。

所以这就是我正在拍摄的内容。我希望有一个在后端运行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);
?>

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

你不需要python来显示ping结果。只需两个PHP文件即可。

  1. index.php将具有AJAX功能以及表单。
  2. ajax.php将拥有ping指定域名地址的代码。
  3. 我担心使用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";
    }
    ?>
    

    <强>输出:

    Output_after_Executing

    <强> 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

希望它有所帮助。