У меня есть php-скрипт, который позволяет скачивать большие файлы с загрузкой.
Это отлично работает, но я ограничил загрузку с php-кодом до 200 кбит / с для каждого подключения.
Таким образом, менеджер загрузок Mozilla Firefox делает только одно соединение, а скорость составляет около 200 кбит / с, но Free-Download-Manager или JDownloader составляет от 2 до 4 соединений, и поэтому скачивание (200 Кбит / с * 2 или 4) = 400 до 800KB / с.
Как я могу остановить это и разрешить только одно подключение для каждого пользователя для загрузки этого файла?
A. Я думаю, первое, что для вас нужно отключить Content-Range
.
14.16 Контент-диапазон
Заголовок объекта Content-Range отправляется с частичным сущностью-телом, чтобы указать, где в полном сущностном теле должно применяться частичное тело. Единицы диапазона определены в разделе 3.12.
Менеджер загрузки может загрузить один тон в двух или нескольких соединениях из-за диапазона. Если вы отключите это как download resume
и multiple connections
не могут быть сделаны в одном файле. они будут делать каждый запрос к файлу с самого начала
пример
LoadModule headers_module modules/mod_headers.so Header set Accept-Ranges none RequestHeader unset Range
Вы также должны посмотреть 14.35.1 байт-диапазоны
B. Введите сеансы загрузки.
Вы можете создать uniqid id
для каждой загрузки и обслуживать его через страницу PHP. Если загрузка по-прежнему активна или была запрошена до того, как вы просто создали страницу
пример
$realFile = "test.pdf"; $fakeFile = uniqid("file"); $uniqid = isset($_REQUEST['id']) ? $_REQUEST['id'] : null; if (empty($uniqid) || strlen($uniqid) < 20 || !ctype_xdigit($uniqid)) { die("Die! Die! Die! Stolen URL"); } $memcache = new \Memcache(); $memcache->connect('localhost', 11211); $runtime = (int) $memcache->get($uniqid); if ($runtime) { die("Die! Die! Die! You Multiple Down loader"); } else { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n"); header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT"); header("Content-Transfer-Encoding: binary"); header("Content-disposition: attachment; filename=$fakeFile.pdf"); // header('Content-type: application/pdf'); header("Content-length: " . filesize($realFile)); readfile($realFile); $memcache->set($uniqid, 1); }
Простой клиент
$url = "a.php?id=" . bin2hex(mcrypt_create_iv(30, MCRYPT_DEV_URANDOM)); printf("<a href='%s'>Download Here</a>",$url);
Он выдавал бы что-то вроде
<a href='a.php?id=aed621be9d43b0349fcc0b942e84216bf5cd34bcae9b0e33b9d913cccd6e'>Download Here</a>
Вам также необходимо сопоставить каждый идентификатор с конкретным файлом …