像Rapidshare这样的限制和等待时间

时间:2009-10-27 04:02:10

标签: php download bandwidth

我有一个开放的环境,没有登录,可以下载许多文件。我现在正在尝试设置一个等待时间功能和每个访问者每个时间段类型的带宽限制(类似于Rapidshare之前你曾经使用它们的那些)。

我应该如何实施这个?我使用的是PHP,所以它的所有限制/优点(如果在这种情况下都适用)都适用。

谢谢大家。

3 个答案:

答案 0 :(得分:5)

我同意Kai的意见,但另一个解决办法可能是以低速提供文件,你可以使用以下功能来做到这一点。

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;
}

答案 1 :(得分:4)

如果没有登录系统,您可以做的最好是限制在固定的时间内每个IP地址下载一次。我相信这也是Rapidshare所做的。

实现此目的的最简单方法是以平面文件格式或数据库记录IP地址开始下载的时间。如果从上一次下载时间开始经过的时间少于所需的等待时间,则将用户重定向到错误页面。否则,将用户重定向到下载链接。

漂亮的计数器只是一个Javascript技巧。您可以使用Javascript计时器轻松编写一个,但它只是用于显示。应始终在服务器端确定实际下载能力(在您的情况下为PHP)。

答案 2 :(得分:1)

尝试睡眠downloader.php文件......

http://php.net/manual/en/function.sleep.php(在设置超时之前设置标题...文件类型)

它会强制页面等待...在链接到下载页面的页面上,您可以放置​​一个类似的javascript计数器让用户知道...它应该在下载页面运行时继续运行,或者您可以将下载程序文件放在新的页面/窗口中,该页面/窗口会自动作为下载文件(x-octet-stream filetype ... http://www.vbulletin.com/forum/showthread.php?70959-HTTP-Headers-to-force-file-to-download-rather-than-auto-open&s=f54c68f056a4c7f13762e43bcfe44fdc

您还可以使用会话来限制实际上能够在一定时间内访问下载页面,但这更具侵略性。