2014-02-25 38 views
5

我想定期檢查php腳本的狀態並將其顯示在瀏覽器中。這是用於發佈的jQuery。獲取由jQuery調用的PHP腳本的進度post

$(document).ready(function() { 
     $("#tempbut").click(function(event){ 
      $('#loader').show(); 
      $('#mainarea').hide('fast'); 

      $.post(
      "template.php", 
      { 
       guide : $('#guide').val(), 
       title : $('#title').val() 
      }, 
      function(data) { 
       $('#mainarea').empty(); 
       $('#loader').fadeOut('slow'); 
       $('#mainarea').append(data); 
       $('#mainarea').show('slow'); 
      } 

     ); 
     }); 
    }); 

在PHP腳本(未公佈),我贊同語句,如「建設的要求......」,「發送的請求......」通知進度的用戶。如果我沒有使用jQuery post,我將能夠在每個回顯後使用flush()和obflush()顯示狀態。也許是因爲回調在輸出之前等待腳本完全執行?

有沒有辦法修改現有的jQuery .post來做到這一點?我看到一些使用.ajax的例子,但不是.post。

如果.ajax是唯一的方法來做到這一點我將如何修改此代碼?

謝謝!

編輯: 它運行!希望有人會發現這有幫助。 (你可以刪除的console.log)

的test.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8" /> 
    <title>TEST</title> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1" /> 
    <script src="http://code.jquery.com/jquery-2.1.0.js"></script> 
    <script> 
     $.ajax({ 
      url: "test.php", 
      xhrFields: { 
       onprogress: function(e) { 
        console.log(e.target.responseText) 
        $("body").html(e.target.responseText) 
        if (e.lengthComputable) { 
         console.log(e.loaded/e.total * 100 + '%'); 
        } 
       } 
      }, 
      success: function(text) { 
        console.log(text) 
        $("body").html(text+"<h1>done!</h1>") 
      } 
     }); 
    </script> 
</head> 
<body> 
<div id="derp">TEST!</div> 

</body> 
</html> 

test.php的

<?php 

for($i = 0; $i<20 ; $i++){ 
    sleep(1); 
    echo $i."</br>"; 
    flush(); 
    ob_flush(); 
} 
?> 
+0

給予好評給你呢! – MonkeyZeus

回答

3

帖子是對Ajax的快捷方式(類型:後),沒有什麼不同。

獲取進度報告有一些方法。現在最簡單的方法是讓2 ajax請求1到同一頁面運行您的php腳本並將狀態存儲在會話中,另一個存儲到不同的頁面從會話中讀取狀態並將其打印給用戶。

UPDATE:

天上,直到PHP腳本完成我不好會不會被記錄下來。 你可以嘗試寫狀態的文件,並從中讀取像這樣:

task.php

for ($i = 0; $i < 10; $i++) { 
    echo($i . "<br/>"); 
    file_put_contents('progress', $i); 
    sleep(2); 
} 

progress.php

if (file_exists('progress') && is_readable('progress')) 
    echo file_get_contents('progress'); 
else 
    echo(-1); 

和腳本:

<script> 
    $(document).ready(function() { 
     task(); 
     getProgress(); 
    }); 
    function task() { 
     $.ajax({ 
      url: 'http://localhost/test/progress/task.php', 
      success: function (data) { 
       console.log('Task is over :' + data); 
      } 
     }); 
    } 
    function getProgress() { 
     $.ajax({ 
      url: 'http://localhost/test/progress/progress.php', 
      success: function (data) { 
       data = parseInt(data); 
       if (data != 9) { 
        console.log('progress :' + data); 
        setTimeout(function() { 
         getProgress(); 
        }, 1000); 
       } 
      } 
     }); 
    } 
</script> 

但是這是一個多用戶環境,這會導致問題。

所以你能做的最好的事情是狀態保存在其中的一個:

  • 使用的數據庫
  • 使用的memcache
  • 使用APC
+1

我試過你的建議沒有運氣。我編輯了OP以反映我的嘗試,請在您有機會時看看。謝謝。 – rawrzors

+0

更新了答案 – Exlord

+0

感謝您解釋您的方法。似乎你正在使用一個文件來傳輸數據。我想盡量減少讀/寫,並避免使用文件。我確實使用了xhrFields和onprogress,並在OP上進行了編輯以反映它。希望它可以幫助別人! – rawrzors