Делать такие вещи нужно не через окно браузера, а через
очереди. У браузера есть максимальное ожидаемое время ответа после чего соединение прервется. Да и заставлять ждать клиента пока ваш сервер загрузит глупо.
Делается это так:
Браузер отправляет запрос "Скачай файл по этой ссылке"
Скрипт кладет эту задачу в очередь и отвечает браузеру "ок"
Другой скрипт получает эту задачу и начинает скачивание, удаляет задание из очереди и пишет куда-то (в бд, например), что все ок, скачано
Браузер (можно после обновления страницы) отображает "Файл скачан"