2011-07-21 55 views
0

我有一個模板做操作的船載,我預計需要30-45分鐘才能完成它的處理......我已經在我的設置應用程序和會話瓦爾超時一些成功@ 2小時。並且我已經將我的請求超時設置爲9999(應該是2.77小時)...的ColdFusion /瀏覽器超時

但是 - 似乎有一個神奇的閾值 - 在20分鐘左右的某個地方,我的瀏覽器進入白屏(無輸出),它看起來好像在CF引擎也停止了對我的任務的工作...

任何人都可以提出一個可靠的方法來保持這個過程中去 - 直到它完成或我的天文發生超時?此外,有什麼方法可以將反饋推送到瀏覽器,以便它不超時......我嘗試過cfflush,但似乎沒有這樣做。

+0

問題可能與任務本身有關。嘗試讓應用程序在沒有運行任務的情況下運行,並查看是否會在20分鐘後停止相同的白屏和/或CF服務器。 –

+0

我不確定我是否明白你的意思......我並不懷疑應用程序變量是否持續分配時間......並且任務正在徘徊......因爲我可以看到更新每個記錄的db中的時間。 ...它只是在一個時間點停止,這是我設置的任何超時之前的方式... – jpmyob

回答

2

你可以使用cfthread在一個單獨的線程你在瀏覽器訪問網頁上運行的過程,然後,你可以使用JavaScript來定期輪詢系統,以檢查其狀態。例如,在cfthread的長時間運行過程中,在您完成工作時,您可以設置一個應用程序變量,指示進程仍在運行,並且在運行過程中有多遠,並在瀏覽器中檢索並報告這些進程。完成後,您可以清除變量,或設置完整的標誌等,並且瀏覽器報告頁面將能夠指示它已完成。

+0

肖恩 - 這聽起來像是一個勝利者。我是試一試 - 會讓你知道。 – jpmyob

0

如果你有一個進程正在運行那麼久,那麼你就需要將它作爲一個計劃任務運行。

我想你的瀏覽器是一個死亡。

您是否檢查過請求是否仍在運行?

<cfsetting requesttimeout= "3600" />將設置頁面將持續一個小時。如果您將其作爲計劃任務運行,則會話超時不應該影響任何內容。

+0

好 - 我已將requesttimeout設置爲9999 ...我想要會話 - 因爲我做了查詢並且stor在一個會議 - 查詢反對 - 因爲我不想繼續打DB ...足以說我需要內存變量的持久性... – jpmyob

0

請不要在這樣的會話中存儲查詢。根據查詢的大小和系統中併發用戶的數量,您可能會很容易導致內存不足,導致當前和所有後續請求都失敗。

該數據庫應該能夠處理繁重的工作。我猜測你在應用程序中進行的大量處理可以重新考慮直接發生在數據庫上,併爲你節省大量時間。

無論如何,你應該考慮像CFTHREAD肖恩提到,計劃任務或排隊系統來處理一個漫長的過程是這樣的。用戶很可能不希望在看到下一個屏幕之前等待該過程結束。如果他們被告知前面的過程是漫長的,只要他們可以繼續執行其他任務,他們就會應對等待。

+0

富 - 通常我會同意你 - 但是這對我來說是唯一的,沒有其他用戶。而工作中的數據不是數據庫 - 因爲它需要解析和寫入文件 - 所以存在大量的文件系統命中。數據庫方面只是作爲一個日誌。在那條路上 - 我想我可以緩存qry - 但是對於我來說,緩存會比緩存更容易 - 或者在我寫代碼的那一刻看起來就像它 - 但是內存在那裏應該沒有區別緩存的查詢和會話結果集.... thx。我正在尋找線程 - 這似乎是要走的路。 – jpmyob

1

我強烈建議重構代碼以使用簡單的消息/隊列系統。實施(或者從頭開始編寫一個簡單的程序)並不需要30分鐘,並且在解決這個問題上會提供很多好處。

例如,它不是整個操作的合格/不合格。如果您在1.5小時的時間內遇到障礙,您將不會再重新執行整個過程,只會失敗的部分。

這樣做,這樣有字面上沒有限制多少處理,你可以做,因爲你將添加並根據需要從棧中移走。

如果您提供更多背景信息,我很樂意幫助您找出合理的分部來實現這一目標。

0

我有同樣的問題。通常,在服務器沒有發送任何內容3分鐘後,瀏覽器會超時。對於大多數這些長時間的操作,我能夠定期輸出一個點來保持瀏覽器的活躍,但是當涉及到從服務器端CSV文件導入20M記錄的一些非常長的查詢時,我不得不以另一種方式來考慮。

cUrl是答案。

所以這就是我所做的。

<? 
function get_page($page) 
{ 
    $ch = curl_init($page); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 0); 
    curl_setopt($ch, CURLOPT_NOPROGRESS,false); 
    curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'progress'); 
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_exec($ch); 
} 

function progress($clientp,$dltotal,$dlnow,$ultotal,$ulnow='') 
{ 
    echo '. '; 
    flush(); 
    return(0); 
} 



get_page('http://www.example.com/my_extremely_long_operation_script.php'); 

?> 

即使沒有來自服務器的輸出,curl會定期更新下載進度。

解決!