2011-07-07 39 views
0

我有一個PHP服務器端腳本,它在foreach循環內通過SSH連接到路由器並執行一些配置塊。如何使用Ajax顯示我的php循環的步驟? (long polling ...)

<?php 
function apply($hostname){ 
    $ssh = new Net_SSH2($hostname); 
    if (!$ssh->login($this->username, $this->password)) { 
     exit('Login Failed'); 
    } 
    $i = 1; 
    foreach($NMConf->configuration as $conf_step){ 
     $ssh->write($conf_step); //Can take 5s... 
     $this->ssh_errors[] = $ssh->read("#"); 
     echo "Step".$i." ok.. <br/>"; 
     $i++; 
     flush(); 
     sleep(1);} 
} ?> 

這fonction由jQuery和Ajax請求叫......

$.ajax({ 
    url:'apply', 
    type:'POST', 
    cache:false, 
    async:false, 
    data:{}, 
    success: function(data){ 
     console.log(data); 
     $('#myDiv').append(data); // *_* 
    } 
}); 

我想顯示在我的輸出div的,不同的步驟,如..

Step 1 (working....) 

那麼

Step 1 OK! 
Step 2 (working ....) 

an d然後

Step 1 OK! 
Step 2 OK! 

我該怎麼做?

我曾看過長時間投票的東西&反向ajax,但它似乎有點棘手。

任何想法!

感謝

回答

1

我建議什麼,東西放在會話,並嘗試問PHP腳本狀態

創建腳本,將讀取會話

<?php 
     $step = $_GET["step"]; 
     if($_SESSION["last_step"] != $step) //just to avoid same info twice 
     { 
     if(isset($_SESSION['step'.$step]) 
      echo $_SESSION['step'.$step]; 
     else 
     } 
     else { echo '10' }; //this will tell you that next step is not executed jet 
     ?> 

更新現有的腳本信息在完成或處理數據時將數據放入會話中。 將您的JavaScript更新爲每秒或每秒執行一次,例如

var _int = setInterval(your_method, 1000); 

後面的所有步驟做到了清晰的間隔_INT clearInterval(_int)

+0

你錯過了最重要的一點,雖然:PHP確實只在腳本的堅持到底的$ _SESSION內容,或者當你告訴它手動這樣做。你只能用'session_write_close()來做到這一點 - 我以後再也沒有試過再打開同一個會話,可能會變成一個有趣的實驗。 – phant0m

+0

會話是有效的,直到它處於活動狀態,並且在請求之間使用相同的會話,所以基本上,您可以在第一次請求時將值放入會話中,並且每個其他請求都只能獲取該數據,以確保您的會話爲每個請求啓動。 –

+1

我不明白你在說什麼。重點是:當腳本正在進行中,並且您從一個腳本/請求中不斷更新$ _SESSION時,這些內容將不會在其他請求/會話中可用,直到*持久*會話數據爲止的請求。 – phant0m