2011-09-01 112 views
3

我需要在PHP中處理非常長的運行進程(刷新大文本文件並返回匹配的行)。當我們從命令行運行平均查詢時,該過程可能需要10-15米。PHP和jQuery:在搜索運行時返回增量結果

我想在PHP/jQuery的,實行由此我開始查詢,然後當他們回來的時候表現出增量結果。

我實現了接近,在那裏我有一個Ajax調用做搜索(工作正常),並有運行調用類的第二種方法得到的結果週期定時器功能。但是,我意識到第二次調用將真正創建一個新的類實例,所以$ this-> current在主查詢和週期更新計時器之間是不同的。

這裏是我嘗試(我踢它關閉點擊一個表單按鈕時)的JavaScript:

<script> 
    function update_status(data) { 
    alert(data); 
    jQuery.each(data, function(key, val) { 
     if (key == "progress") 
     $("#progressbar").progressbar({ value: val }); 
    }); 
    } 
    function progress_setup() { 
    setInterval(function() { 
     jQuery.ajax({ 
     type:'POST', 
     dataType:'json', 
     complete:function(XMLHttpRequest, textStatus){ 
      update_status(textStatus) 
     }, 
     url:'<?php echo url_for("@grep_status"); ?>' 
     })}, 
     2000); 
    } 
    function grep(elements) { 
    jQuery.ajax({ 
     type:'POST', 
     dataType:'html', 
     data:jQuery(elements).serialize(), 
     success:function(data, textStatus){jQuery('#results').html(data);}, 
     beforeSend:function(XMLHttpRequest){progress_setup()}, 
     url:'/grep'}); 
    } 

</script> 

但是,這似乎並沒有在正確的軌道。核心問題似乎是:

  1. 長期運行的任務在PHP
  2. 你如何獲得該任務回到一個進度條的狀態和增量結果對話框?

TIA 邁克

+0

這與進度條類似(儘管不完全相同)。檢查[執行ajax狀態檢查](http://stackoverflow.com/questions/5113012/implementation-of-ajax-status-check)。它看起來像你在找什麼。 – Herbert

回答

1

您必須使用數據庫或文件共享您的操作狀態。然後在您的/grep操作中,您定期在數據庫或文件中寫入狀態(更新狀態)。

然後,你需要另一個腳本(如/grep_state)讀取的狀態,並返回給客戶端。

什麼,你不能做的是使用PHP的對象實例,因爲這個它的範圍僅限於單個請求共享的狀態。你必須堅持這個國家。

另一個問題可能是由於Web服務器或瀏覽器的請求超時,您的長時間運行的任務被終止。我要麼以CLI模式運行腳本(從web服務器/請求分離),要麼編寫一個簡單的作爲守護程序運行的作業調度程序。

守護程序從套接字(或與其他進程通信的任何其他方式)獲取參數,並使用您的worker腳本啓動php-CLI。該狀態也是使用文件或數據庫共享的。

0

好像最容易做的事情是在PHP了拆分任務,併發送某種標誌的回你的客戶端應用程序告訴它的時候,它的完成。

可能:

  1. 獲取文件的大小。
  2. 開始查詢,返回第一個結果的字符數。
  3. 更新進度條。
  4. 開始從最後一個字符數開始的下一個查詢,返回第二個結果和字符數。
  5. 更新進度條。
  6. 繼續直到文件到達結尾。

雖然這不會給你一個完美的進度更新,它將表明你已經搜索了多少文件。

我認爲關鍵是要設置您的服務器的參數,允許您限制/過濾您的查詢結果。

0

您可以嘗試儘早刷新輸出 - 但這取決於您的服務器設置。例如:

// Script starts, does first block of program 
echo "1"; 
flush(); 
// Second block starts and finishes 
echo "2"; 
flush(); 
// Etc... 

每個塊完成後,刷新一個響應。