Отменить длительный поиск

У меня есть веб-приложение с PHP-серверным языком на NGINX. Через 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? Благодаря!

Related of "Отменить длительный поиск"

Поэтому мне все еще не удалось найти способ JavaScript, чтобы отменить уже начатую загрузку, которая появляется в менеджере загрузки браузера. Но, используя session_write_close после session_start, можно избежать этих проблем параллелизма, и поэтому несколько сценариев 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=/"); session_write_close(); while (Stream::MORE_DATA == $client->receive($data)) { print $data; flush(); }