我在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配置更改解決?謝謝!
你有沒有考慮在另一個瀏覽器窗口而不是iframe中進行下載?這樣做將允許用戶繼續瀏覽/與頁面交互,而不用擔心停止下載。 – 2015-01-09 22:01:52
感謝您的建議。但是,即使請求位於單獨的瀏覽器選項卡中,網站的其他頁面也不會加載/刷新(我認爲,因爲NGINX一次只能爲該PHP會話執行一個請求) 。 – 2015-01-09 22:17:45
你確定這是一個nginx問題,而不是php?在php中,如果你開始一個會話並且不結束它,那麼在該請求結束之前不能處理該會話的新請求。 http://php.net/manual/en/ref.session.php請參閱session_write_close – 2015-01-09 22:20:16