簡體   English   中英

如何使用Ajax在PHP頁面中的運行時顯示Shell腳本的輸出

[英]How to display output of shell script at runtime in php page using ajax

我有兩個PHP頁面。 第一頁將加載到客戶端瀏覽器並顯示按鈕。 如果單擊,它將使用ajax調用執行我的第二個php頁面。 第2個php頁面使用ssh2_exec連接到服務器,執行一些shell腳本,並在同一頁面上顯示輸出而無需刷新。 我可以通過現有頁面實現這一目標。 但是在第二頁完成執行后,它將立即顯示完整的輸出。 我想作為第二個php頁面開始執行,輸出應開始在客戶端瀏覽器上逐行顯示。

以下是我的2頁:

php第1頁:

<!DOCTYPE html>
<head>
<link rel="stylesheet" href="../css/new_style.css" />
</head>
<script>
function disable()
{
document.getElementById("save").disabled = true;
}

function enable_button()
{
document.getElementById("save").disabled = false;
if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
}
else {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}

xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   document.getElementById('output').innerHTML = xmlhttp.responseText;
 }
}

xmlhttp.open('GET', 'arg0_orgcmd_exec.php?id=118' , true);
xmlhttp.send();
}


function disable_button()
{
document.getElementById("execute").disabled = true;
   }

</script>


<body>

<div class="main_body">

<form action=" " method="" name="output_frame">
<center>
<input class=" " id="execute" onclick="enable_button();" type="button" name="submit" value="Execute" />
<input class=" " disabled name="save"  id="save" type="submit"  onclick="disable_button();" value="Save In File" />
<input class=" btn btn-danger back-btn" type=button onclick="location.href='main_menu.php'" value='Close' />
</center>
</form>
</div>

<div id="output" class="output">
</div>
<iframe name="iframe_output"></iframe>

</body>
</html>

arg0_orgcmd_exec.php:

<?php
$page_id = $_GET['id'];

$conn = ssh2_connect($server_ip,$server_port);
ssh2_auth_password($conn, $server_id, $server_pass);

//Checking web.lock file
$stream_lock =  ssh2_exec($conn, "ls /tmp/web.lock" );
stream_set_blocking($stream_lock, true);
$check_lock = stream_get_contents($stream_lock);
if(empty($check_lock)) {
            $script_output1 = ssh2_exec($conn, "touch /tmp/web.lock ;  my_script.sh ; rm -rf /tmp/web.lock" );
        stream_set_blocking($script_output1, true);
        echo "<pre>";
        while($line1 = fgets($script_output1)) {
        echo $line1;
        ob_flush();
        flush();

               }
        echo "</pre>";
                                echo "<br />";
                                echo "<h2>Script Output Finished!!!!<h2>";
                                echo "<br />";
}else {echo "Already one pending script running in selected server. Kindly wait!!!"; }



fclose($script_output1);
ssh2_exec($conn, 'exit');
unset($conn);

?>

代碼的問題在於,使用AJAX時,您無法獲取可用的數據,只能獲取服務器端腳本關閉連接后的完整響應。

一種解決方案是使用服務器發送事件

var evtSource = new EventSource("arg0_orgcmd_exec.php?id=118");
evtSource.onmessage = function(e) {
  var newElement = document.createElement("div");

  newElement.innerHTML = "<br />message: " + e.data;
  document.getElementById('output').appendChild(newElement);
}

您的PHP腳本也需要修改:

header("Content-Type: text/event-stream\n\n");
$page_id = $_GET['id'];

$conn = ssh2_connect($server_ip,$server_port);
ssh2_auth_password($conn, $server_id, $server_pass);

//Checking web.lock file
$stream_lock =  ssh2_exec($conn, "ls /tmp/web.lock" );
stream_set_blocking($stream_lock, true);
$check_lock = stream_get_contents($stream_lock);
if(empty($check_lock)) {
        $script_output1 = ssh2_exec($conn, "touch /tmp/web.lock ;  my_script.sh ; rm -rf /tmp/web.lock" );
        stream_set_blocking($script_output1, true);
        echo "event: commandStarted\n";

        while($line1 = fgets($script_output1)) {
             echo 'data: ' . json_encode($line1) . "\n\n";
             ob_flush();
            flush();
       }          
       echo "event: commandEnded\n";
} else {
     echo 'data: "Already one pending script running in selected server. Kindly wait!!!"' . "\n\n"; 
}

fclose($script_output1);
ssh2_exec($conn, 'exit');
unset($conn);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM