Ограничения и время ожидания, как Rapidshare
У меня открытая среда, нет логинов, где можно скачать несколько файлов. Сейчас я пытаюсь настроить функцию времени ожидания и ограничение пропускной способности для каждого посетителя за период времени (как в Rapidshare, если вы когда-либо использовали их ранее).
Любые идеи, как я должен идти о реализации этого? Я на PHP, поэтому все его ограничения / преимущества (если таковые имеются в этом случае) применяются.
Спасибо вам всем.
3 ответа
Без системы входа в систему вы можете ограничиться одной загрузкой на IP-адрес в фиксированное время. Я считаю, что это то, что делает Rapidshare.
Самый простой способ реализовать это - записать время, когда IP-адрес начинает загрузку, либо в формате простого файла, либо в базе данных. Если время, прошедшее с предыдущего времени загрузки, меньше необходимого времени ожидания, перенаправьте пользователя на страницу с ошибкой. В противном случае перенаправьте пользователя на ссылку для скачивания.
Изящный счетчик - это просто уловка Javascript. Вы можете легко написать один, используя таймеры Javascript, но это только для галочки. Фактическая возможность загрузки всегда должна определяться на стороне сервера (в вашем случае на PHP).
Я согласен с Каем, но еще одним решением может быть подача файла на низкой скорости, для этого можно использовать следующую функцию.
function Doo_Download($path, $speed = null)
{
if (is_file($path) === true)
{
set_time_limit(0);
while (ob_get_level() > 0)
{
ob_end_clean();
}
$size = sprintf('%u', filesize($path));
$speed = (is_null($speed) === true) ? $size : intval($speed) * 1024;
header('Expires: 0');
header('Pragma: public');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Content-Transfer-Encoding: binary');
for ($i = 0; $i <= $size; $i = $i + $speed)
{
echo file_get_contents($path, false, null, $i, $speed);
flush();
sleep(1);
}
exit();
}
return false;
}
Попробуйте спящий файл downloader.php...
http://php.net/manual/en/function.sleep.php (установите заголовки перед установкой тайм-аута... тип файла)
Это заставит страницу ждать... и на странице, которая ссылается на страницу загрузки, вы можете поместить своего рода счетчик javascript, чтобы сообщить пользователю... он должен продолжать работать, пока страница загрузки работает, или вы можно поместить файл загрузчика в новую страницу / окно, которое автоматически преобразуется в загруженный файл (тип файла x-octet-stream... http://www.vbulletin.com/forum/showthread.php?70959-HTTP- Заголовки для принудительного открытия файла для загрузки вместо автоматического открытия & s = f54c68f056a4c7f13762e43bcfe44fdc)
Вы также можете использовать сеанс, чтобы ограничить фактическую возможность доступа к страницам загрузки в течение определенного времени, но это более инвазивно.