2015-01-09 102 views
0

我在NGINX上有一個PHP服務器端語言的Web應用程序。通過JS,用戶能夠從非常緩慢的數據庫下載由PHP動態構建的文件。因此,接收打印的第一個字節大約需要20秒。然後,更多的數據會在之後不斷流出。取消長時間運行下載

PHP:

header("Content-Disposition: attachment; filename=\"" . $filename . ".txt\""); 
header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Set-Cookie: fileDownload=" . $filename . "; path=/"); 

while (Stream::MORE_DATA == $client->receive($data)) { 
    print $data; 
    flush(); 
} 

此下載是通過iframe發生(它有留爲其他原因的iframe):

iframe = document.createElement("iframe"); 
iframe.style.display = "none"; 
iframe.src = downloadFileUrl; 
(document.getElementsByTagName("body")[0]).appendChild(iframe); 

在用戶想要瀏覽的情況下到新窗口的另一個頁面,另一個頁面將不會加載,直到下載完成,因爲NGINX一次只提供一個請求(我認爲)。所以我啓用的方式爲用戶取消下載:

iframe.contentWindow.stop(); 
iframe.parentNode.removeChild(iframe); 

這個成功的作品如果下載打印的文件的第一部分之前在初始20秒取消。但是,如果在第一次打印後取消,即使iframe被取消,文件仍會繼續下載。

除了通過互聯網瀏覽器的下載管理器手動取消以外,是否有其他方法可以完全中止下載?

也許這可以通過JavaScript,PHP或NGINX配置更改解決?謝謝!

+0

你有沒有考慮在另一個瀏覽器窗口而不是iframe中進行下載?這樣做將允許用戶繼續瀏覽/與頁面交互,而不用擔心停止下載。 – 2015-01-09 22:01:52

+0

感謝您的建議。但是,即使請求位於單獨的瀏覽器選項卡中,網站的其他頁面也不會加載/刷新(我認爲,因爲NGINX一次只能爲該PHP會話執行一個請求) 。 – 2015-01-09 22:17:45

+0

你確定這是一個nginx問題,而不是php?在php中,如果你開始一個會話並且不結束它,那麼在該請求結束之前不能處理該會話的新請求。 http://php.net/manual/en/ref.session.php請參閱session_write_close – 2015-01-09 22:20:16

回答

0

所以我仍然無法找到一種JavaScript方式來取消瀏覽器下載管理器中已經啓動的下載。但是,使用session_write_close在session_start後,將允許避免這些併發性問題,因此,多個PHP腳本中simultaneuosly跑(即仍可以在用戶正在瀏覽的頁面在不同的窗口會出現下載)

header("Content-Disposition: attachment; filename=\"" . $filename . ".txt\""); 
header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Set-Cookie: fileDownload=" . $filename . "; path=/"); 

session_write_close(); 
while (Stream::MORE_DATA == $client->receive($data)) { 
    print $data; 
    flush(); 
}