Вам не нужно читать все целиком - просто введите цикл, читая его, скажем, на 32-килобайтных блоках и отправляя его в качестве вывода. Еще лучше, используйте fpassthru , который делает то же самое для вас ....
$name = 'mybigfile.zip';
$fp = fopen($name, 'rb');
// send the right headers
header("Content-Type: application/zip");
header("Content-Length: " . filesize($name));
// dump the file and stop the script
fpassthru($fp);
exit;
еще меньше строк , если вы используете readfile , который не требует вызова fopen ...
$name = 'mybigfile.zip';
// send the right headers
header("Content-Type: application/zip");
header("Content-Length: " . filesize($name));
// dump the file and stop the script
readfile($name);
exit;
Если вы хотите получить еще более привлекательную информацию, вы можете поддерживать заголовок Content-Range , который позволяет клиентам запрашивать определенный диапазон байтов вашего файла. Это особенно полезно для передачи файлов PDF в Adobe Acrobat, который просто запрашивает фрагменты файла, необходимые для рендеринга текущей страницы. Это немного запутанно, но посмотрите пример .