2017-03-22 42 views
0

我有兩個php頁面。第一頁將加載到客戶端瀏覽器和顯示按鈕。如果點擊它將使用Ajax調用來執行我的第二個PHP頁面。第二個php頁面使用ssh2_exec連接到服務器,執行一些shell腳本並在不刷新的情況下在同一個加載的頁面上顯示輸出。我可以用我現有的頁面來實現這一點。但它在第二頁完成執行後立即顯示完整的輸出。我希望作爲第二個php頁面開始執行,輸出應該在客戶端瀏覽器上逐行顯示。如何使用ajax在運行時顯示shell腳本的輸出

下面是我的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); 

?> 

回答

0

與您的代碼的問題是,隨着AJAX你不能得到的數據是可用的,只有服務器端腳本關閉連接後的完整響應。

一種解決方案是使用Server Sent Events

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); 
相關問題