Принудительная загрузка большого файла с помощью php

Многие пользователи моего сайта сообщили о проблемах с загрузкой большого файла (80 МБ). Я использую принудительную загрузку с использованием заголовков. При необходимости я могу предоставить дополнительные настройки php. Я использую CakePHP framework, но этот код является обычным php. Я использую php 5.2 с apache на выделенном виртуальном сервере из медиа-храма CentOS Linux. Вы видите какие-либо проблемы со следующим кодом:

set_time_limit(1500); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"" . basename($file_path) . "\""); header("Content-Length: ".$content_length); header("Content-Transfer-Encoding: binary"); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: private', false); header('Pragma: public'); header('Expires: 0'); //Change this part $handle = fopen($file_path, 'rb'); while (!feof($handle)) { echo fread($handle, 4096); ob_flush(); flush(); } fclose($handle); exit; 

В основном, проблема заключается в том, что загрузка начинается, а затем останавливается посередине. Я думал, что это проблема с лимитом, поэтому я добавляю код set_time_limit. Раньше я использовал функцию чтения php, но это также не работало плавно.

Проблема с передачами, инициированными PHP, связана с тем, что они редко поддерживают частичные запросы:

 GET /yourfile HTTP/1.1 Range: bytes=31489531-79837582 

Всякий раз, когда браузер сталкивается с проблемой передачи, он попытается возобновить загрузку. Ваш php-скрипт не подходит для этого (это не тривиально, поэтому никто не делает).

Так что действительно избегайте этого. Перенаправить пользователей в статический файл и позволить веб-серверу обрабатывать его. Если вам нужно обработать авторизацию, используйте трюки, такие как символические ссылки или перезаписывающие устройства, которые проверяют файлы cookie сеанса или даже статический файл разрешений ( ./allowed/178.224.2.55-file-1 ). Любые требуемые дополнительные HTTP-заголовки могут быть введены аналогичным образом или с помощью .meta файла.

Я не вижу никаких проблем, но для того, чтобы S & G попытался разместить set_time_limit внутри цикла while. Это гарантирует, что они не достигнут жесткого предела и (пока клиент принимает информацию) срок продлевается.