2012-12-01 98 views
0

我正在向使用cURL下載XML的ajax.php文件發送一個Ajax請求。在ajax請求中取消cURL

//ajax.php 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERPWD,  USERNAME.':'.PASSWORD); 
curl_setopt($ch, CURLOPT_POSTFIELDS, getData()); 
curl_setopt($ch, CURLOPT_URL,  $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT,  true); 
$data = curl_exec($ch); 

echo $data; 

用戶未確認此過程並可能刷新網頁。

有時curl_exec($ch)需要很長時間,我得到一個timeout錯誤。此錯誤阻止腳本繼續。我搜索並沒有找到確切的解決方案來解決這個問題。

現在更大的問題是,在這種情況下,當ajax請求在後臺處理並且用戶刷新頁面時,它不會刷新,直到ajax請求超時或結束。

我認爲在頁面刷新時中止該cURL請求是一個很好的臨時解決方案,但不知道該怎麼做。

注意: Ajax請求已經使用jQuery設置並中止它ajax.abort()沒有解決問題。

+0

你知道你可以回答你自己的問題,對吧? – wormhit

+0

@wormhit完成的朋友!但它如何幫助我? – Omid

+0

很多用戶在看到答案率很低時就不會回答問題。您正在放鬆將真正查看您的問題的用戶。我不是在評判你什麼。只是信息。 – wormhit

回答

-1

您可以嘗試使用try/catch塊來返回可以在發生此(或其他)錯誤時處理的內容。

+0

我仍然應該等待cURL請求,並嘗試/趕上沒用 – Omid

0

您應該改變應用程序處理此功能的方式。 我會嘗試在Ajax調用和實際計算過程之間放置另一個抽象層。

例如,ajax調用可以初始化php後臺進程或更好的中間件消息隊列與工人。作爲迴應,您向客戶提供職位ID(或將其存儲在與用戶ID鏈接的數據庫中)。然後onTimeout()正在執行ajax請求來獲取作業的狀態。同時後臺進程或中間件工作者正在處理該任務並將響應保存到具有相同作業ID的db中。

因此,最終客戶初始化工作,之後只檢查該工作的狀態。工作完成後,你可以在服務器端知道它。所以在下一個Ajax請求你迴應實際的工作結果。 Javascript正在接收響應結果,並正在執行回調函數,該函數正在客戶端繼續工作。

+0

我認爲你不明白什麼問題是。可能我的問題沒有清除。我不擔心ajax請求結果或任何會話,會導致我的程序有問題的是調用ajax的網頁,它在Ajax請求正在進行時不會刷新。 – Omid