2009-08-25 59 views
2

好吧,即時通訊不是很好描述這些事情,所以忍受着我..簡單的PHP AJAX文件讀取進度問題!

我試圖找到一種方式來顯示狀態/進度欄類的事情來顯示百分比(或任何)的多少的文本文件已經被php讀取/解析。我大概知道我需要做什麼(通過計算行或文件大小以及實際文本文件的大小),但是我無法爲自己的生活研究如何實際執行它。我使用的是PHP/AJAX,我真正想要的是每隔一段時間更新一次div(5秒鐘或更長時間)以顯示狀態,直到全部完成,然後顯示輸出。容易啊,雖然我該怎麼做,我不知道。在這方面,我發現了一些非常有用的帖子,但沒有什麼能夠與我所擁有的一起工作。

如果任何人都可以給我一些粗略的提示/想法,我會很愚蠢的感激(這真的是在做我的頭)! 在此先感謝!

回答

1

......怎麼

我們必須假定有一些方法來確定總的工作(100%),而PHP腳本是在(與%了狀態)的地步,所以如果它是讀取/解析文本文件時,可以通過將總行數寫入數據庫或文本文件來啓動解析函數。然後,它還可以每5秒將同一個文件寫入哪個行號。 js ajax函數調用該文本文件以獲取總數和點數。當PHP文本解析器完成後,它破壞了狀態文件,以防止其佔用的服務器空間,文件名衝突等


例子:

首先,(jQuery的)AJAX功能的POST服務器:

$.post("parser.php", { file: "somefile.txt"}); 
//I admit, I'm not sure if this is how a file would be posted with ajax 

接下來,PHP拉文件並啓動解析器功能:

$tmpName = $_FILES['userfile']['tmp_name']; 
    $fileName = $_FILES['userfile']['name']; 

    //Turn the file into an array, so that you can use the array count for status: 
    $content = file($tmpName); 

    // Get the array count as the total, as it equals the line count: 
    $total = count($content); 

    //Write the filesize to a unique "total" txt file: 
    $total_file = fopen($fileName."-total.txt", 'x'); 
    fwrite($total_file, $total); 
    fclose($total_file); 

    //Pass the Array to the parser function: 
    parser($content, $fileName); 

    //Kill the file when the function is done: 
    unlink($fileName); 

    function parser ($file_array, $filename) { 
      //creates the status file and then closes it, to ensure that it 
      //exists for the loop but gets overwritten each time 

      $status_file = fopen($filename."-status.txt", 'x'); 
      fclose($status_file); 

      foreach($file_array as $position => $data) { 
        //Do your parsing here // 
        ............. 
        //reopen status file and wipe out what is in it already: 
        $status_file = fopen($filename."-status.txt", 'w'); 
        fwrite($status_file, $position); 
        fclose($status_file); 
      } 

     } 

因此,由於狀態和總文件共享希望上傳文件的唯一名稱,ajax函數知道去哪裏看。它可以做到這一點:

total = $.get("somefile-total.txt"); 

current = $.get("somefile-status.txt"); 

status = current/total; 
+0

嘿,感謝您的幫助。我沒有想過這樣做,這是有道理的,雖然寫入一個單獨的文本文件不是一個安全問題?應該玩一下,看看我們如何去。謝謝 – rich 2009-08-25 12:49:11

+0

我試圖想像某種方式讓解析的腳本能夠響應ajax請求,當它解析,或有另一個腳本檢查狀態,但我很確定這些都是不太可能的。另一個選項是打開一個「長輪詢」服務器推送類型的情況,其中ajax和腳本之間的連接保持打開狀態,並且在上面的例子中循環返回到ajax函數而不是文本文件。 – Anthony 2009-08-25 13:11:27

+0

是的,它的一個噩夢真的這...我可以堅持只是傳統的圖形...嗯 感謝您的所有幫助,雖然,其巨大的讚賞!可以研究一下長期投票的內容,我認爲它看起來相關。 – rich 2009-08-25 13:16:17

0

有一些非常好的JQuery提供的庫可以完成你所要求的功能。除非這純粹是爲了學習的目的,否則我會看看這些,並避免重建車輪。

http://plugins.jquery.com/search/node/upload

+0

啊,我知道......我過去用過jquery,效果很好。但爲此,我真的不想使用它,這也不是爲了上傳。但是,謝謝,我可能不得不走下去。 – rich 2009-08-25 13:55:43