2010-08-09 126 views
3

我一直在嘗試解決一個小問題很長一段時間,但它似乎我無法。當客戶端瀏覽器關閉時中斷服務器端perl CGI腳本

我寫了一個HTML頁面,在提交表單時調用perl CGI腳本。這個CGI在服務器端執行一定數量的任務,並且我讓腳本將這些任務的步驟打印到HTML頁面上的iframe中。事情是,如果客戶端關閉瀏覽器或剛剛離開頁面,CGI腳本在服務器端中斷

HTML代碼:

<form action="/path/to/script.cgi" method="post" enctype="multipart/form-data" target="processing"> 
<p>File to analyse: <input type="file" name="filename" size="50"/></p> 
<p><input type="submit" name="Submit" value="Analyse" /></p> 
</form></font></p> 

<p style="margin-left: 20"><font face="Arial" size="2" color="#000000">Analysing the file may take a while</font></p> 
<iframe name="processing" width="70%" height="300"> 

</iframe> 

CGI腳本:

my $query = new CGI; 
print $query->header(-type => 'text/plain'); 
function1(); 
function2_takesLongTime($parameter); 
function3(); 

因此,可以說是 「功能1」 只是準備一些東西文件分析(創建文件夾等)。 「功能2」是大功能(可能持續15分鐘)。它是一個Perl程序,它有很多「打印」,由於CGI的「文本/純文本」標題,它被重定向到html頁面的iframe中(在程序中不使用緩衝$ |)。 httpd被配置爲超時時間遠遠超過15分鐘,因此它不是來自那裏的。 「function3」正在清理。

如果客戶端停留在html頁面上,CGI腳本完美運行。 如果客戶端停止(例如,用戶關閉窗口),則函數1和2將在服務器端執行,但腳本似乎因爲不進行清理而被中斷。

我試圖用系統命令啓動「function2」作爲一個獨立的程序,或者創建一個perl庫並調用這個庫的main函數,它仍然以同樣的方式結束。 我認爲無論客戶端是否停留在頁面上,服務器端腳本仍會一直運行。是因爲CGI腳本的「text/plain」標題無法返回給客戶端,腳本中斷?

如果有人能幫我解決這個問題,我會非常感激。

+0

看來問題來自我的「功能2」中的系統調用命令。我嘗試調用其他不具備系統命令的函數,即使客戶端沒有響應,CGI腳本也會一直運行。我也嘗試刪除CGI頭文件,並且腳本也完美運行。我想這是系統調用和CGI將標準輸出實時刷新到客戶端的事實,從而導致錯誤發生...... – 2010-08-09 17:04:32

回答

3

您需要以不同方式構建軟件。使用某種異步編程,作業隊列可以很好地工作,並且只使用CGI程序將作業放入隊列中。通過使用您已經提到的庫進行轉換。

你似乎並不熟悉這個概念,所以我推薦一個非常簡單的:Qudo。如果你覺得它太嚴格了,可以切換到Gearman,我認爲它是Perl世界中最流行的一個(請參閱接口Gearman::XSGearman)。

TIMTOWTDI:如果你完全放棄CGI.pm提供的執行環境,請參閱Catalyst's RunAfterRequest

+0

感謝您的回覆Daxim, 「TIMTOWTDI」:這是正確的,但是我的應用程序是線性的。即使認爲我運行的程序非常大,我並不需要多任務。此外,我真的很想了解我的CGI腳本發生了什麼。我一直在用各種不同的方式進行測試,我對這個問題非常好奇。我問了一些同事,沒有人知道它來自哪裏。 無論如何,如果我寫過更大的應用程序,我一定會仔細看看Gearman! – 2010-08-09 15:15:35

+0

Beanstalk是另一個很好的工作隊列;我在生產代碼中使用它,它非常穩定,並且Perl界面易於使用。 – Ether 2010-08-09 16:25:10

相關問題