我一直在嘗試解決一個小問題很長一段時間,但它似乎我無法。當客戶端瀏覽器關閉時中斷服務器端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」標題無法返回給客戶端,腳本中斷?
如果有人能幫我解決這個問題,我會非常感激。
看來問題來自我的「功能2」中的系統調用命令。我嘗試調用其他不具備系統命令的函數,即使客戶端沒有響應,CGI腳本也會一直運行。我也嘗試刪除CGI頭文件,並且腳本也完美運行。我想這是系統調用和CGI將標準輸出實時刷新到客戶端的事實,從而導致錯誤發生...... – 2010-08-09 17:04:32