Сложно сказать, связано ли это с используемыми вами заголовками или с ошибкой сервера.Тем не менее, я обычно использую следующее без каких-либо проблем:
header("Cache-Control: private");
header("Content-Type: application/stream");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".basename($file));
readfile($file);
exit();
Таким образом, вы можете попробовать описанное выше и посмотреть, если это имеет какое-либо значение.(Можно предположить, что если ваше соединение медленное, тот факт, что вы не предоставляете заголовок Content-Length, может не помочь ситуации.)