Отменить длительную загрузку

0

У меня есть веб-приложение с 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? Благодарю!

  • 0
    Рассматривали ли вы загрузку в другом окне браузера вместо iframe? Это позволит пользователю продолжить просмотр / взаимодействие со страницей, не опасаясь остановки загрузки.
  • 0
    Спасибо за предложение. Я попытался это сделать ... однако, даже если запрос находится на отдельной вкладке браузера, другие страницы сайта не будут загружаться / обновляться (я думаю, потому что NGINX выполняет только один запрос за один раз для этой сессии PHP) ,
Показать ещё 3 комментария
Теги:
nginx
iframe
abort

1 ответ

0
Лучший ответ

Поэтому мне все еще не удалось найти способ 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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню