2015-01-09 4 views
0

У меня есть веб-приложение с языком PHP-сервера на NGINX. Через JS пользователь может загрузить файл, который динамически создается PHP из базы данных, которая очень медленная. Поэтому для получения первых байтов для печати требуется около 20 секунд. Затем после этого все больше данных непрерывно выводится.Отменить long running загрузить

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) , –

+0

Вы уверены, что это проблема nginx, а не php? В php, если вы начинаете сеанс и не заканчиваете его, никакие новые запросы для этого сеанса не могут быть обработаны до тех пор, пока этот запрос не завершится. http://php.net/manual/en/ref.session.php см. session_write_close –

ответ

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(); 
}