2010-08-03 59 views
1

此問題與我之前詢問過的問題有關,請參閱here關於分割AJAX響應的進一步問題

,以此來實現分段Ajax響應,我創建了執行此代碼:

客戶端首先調用其初始化過程的腳本。在服務器端,startScript.cgi代碼開始生成數據,並且這樣做時,它將響應分組爲塊,並將它們按順序編入索引的單個文件(chunk1.txt chunk2.txt等)。在startScript.cgi啓動這個過程之後,客戶端立即開始第二個ajax請求,發送到gatherOutput.cgi,參數?index = 0。

gatherOutput.cgi看到請求,然後查看'chunk'。$ index。'。txt',然後返回數據。客戶端將其輸出到html,然後開始第二個ajax請求,收集具有參數?index = 1的gatherOutput.cgi,等等,直到所有來自startScript.cgi的數據都被報告。

如果gatherOutput.cgi無法找到「塊$ index.txt」,它進入這個循環:

until(-e "$directory/chunk$index.txt") 
{ 
    #nothing 
} 
open $fh, "<$directory/chunk$index.txt" || warn "File not found. blah blah"; 
#Read file and print, etc... 

注意,startScript.cgi運行的代碼可能需要很長的時間才能完成,所以點將同時廣播startScript.cgi的舊輸出,因爲它正在生成新的輸出。

這樣做的問題是性能受到影響,儘管很久以前創建了輸出,但輸出需要一段時間才能出來。我假設這是由於硬盤訪問與startScript.cgi中的CPU操作相比非常慢,所以gatherOutput.cgi經常等待新的塊寫入,或者客戶端經常在等待gatherOutput.cgi讀取文件等等。雖然可能還有其他問題。

有沒有人有任何想法或建議來解決這個問題?或者如果有人對這個問題有不同的解決方法,那也會很棒。

順便說一句,startScript.cgi只能被調用一次,它會啓動一個大任務系統任務(帶有系統轉義,如exec,系統或反引號),這些任務會持續運行,並且無法被細分。

回答

2

當文件不存在時,gatherOutput.cgi不應該放入循環中。相反,將狀態返回給您的AJAX請求,該文件尚不存在,然後讓它等待(使用setInterval或setTimeout),並在這麼多秒後重試。

這將在您的服務器上更容易。對於用戶,您仍然可以顯示加載圖形或其他內容,讓他們知道該過程仍在後臺進行。

+0

好主意,我會實現這一點,看看它提高了多少性能。 謝謝! 任何進一步的建議仍然讚賞。 – 2010-08-03 16:53:52