Как сделать скачивание архивов на php с ограничением скорости?

программирование php

Есть функция
function file_download($filename, $mimetype) {
// Задаем ограничение скорости закачки в байтах в секунду
// или ноль, если ограничений не требуется.
// Другим способом задания этого параметра может быть его определение
// через константу, посредством функции define(), в этом случае значение
// будет неизменным для любого запуска скрипта.
// Можно его значение задавать и снаружи функции исходя из каких-либо соображений,
// например, роли пользователя или загрузки сервера, и получать его
// посредством директивы global.
$speed = 15; # Скорость скачивания в килобайтах
$download_speed = ($speed*1024); // Переводим в байты.
// Задаём время дискретизации. С этой периодичностью клиенту будут отдаваться
// блоки данных считываемые из файла.
$time_discret = 1;
if (file_exists($filename)) {
header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
header('Content-Type: ' . $mimetype);
header('Last-Modified: ' . gmdate('r', filemtime($filename)));
header('ETag: ' . sprintf('%x-%x-%x', fileinode($filename), filesize($filename), filemtime($filename)));
header('Content-Length: ' . (filesize($filename)));
header('Connection: close');
header('Content-Disposition: attachment; filename="' . basename($filename) . '";');
$f=fopen($filename, 'r');
// Проверяем задано ли ограничение скорости
if((int) $download_speed > 0) {
while(!feof($f)) {
// Включаем таймер
$time_start = microtime(true);
// Читаем блок данных, которых мы должны отдать за время дискретизации
echo fread($f, ceil($download_speed*$time_discret));
flush();
// Находим время за которое наши данные отправлены
$time_end = microtime(true);
$time = $time_end - $time_start;
// Если время, оставшееся до конца времени дискретизации больше нуля,
// то приостанавливаем выполнение скрипта на величину этого времени в микросекундах.
if($time_discret-$time > 0) usleep(($time_discret-$time)*1000000);
}
}
else {
// Если у нас не задано ограничение скорости, то выполняем старый вариант кода
while(!feof($f)) {
echo fread($f, 1024);
flush();
}
}
fclose($f);
} else {
header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
header('Status: 404 Not Found');
}
exit;
}
Файл передаётся, но меняется тип на text/html. Как передать файл с ограничением скорости, но чтобы тип не менялся?
Передаю архивы (rar и zip).

Примечание:
Epsiloncool, такой вариант не подойдёт, потому, что есть два скрипта, в одном скачивать можно быстро, а в другом медленно, так что надо средствами php.
wirtaw, echo fread($f,$download_speed); - и при чём тут это? Ограничить скорость у меня получилось уже давно, но почему он становится текстовым после скачивания, в этом проблема.

Примечание:
А вообще fread($f,1024); это отдавать файл по 1024 байт.

Примечание:
Удивительно, случайно получилось так, что не объявил переменную $mimetype и всё работает нормально.

Примечание:
Сделал, проблема спряталась вообще в другой функции. Спасибо за ответы :)
Ответы:
Помоему вы занимаетесь ерундой. PHP не должен заниматься такими вещами! Ограничение скорости - это задача сервера.
поменять
echo fread($f,1024);
на        
echo fread($f,$download_speed);
сделать test.php на одной скорости
и потом менять


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.