1

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

任何想法我应该如何去实现这个?我在 PHP 上,所以它的所有限制/优势(如果有的话)都适用。

谢谢你们。

4

3 回答 3

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;
}
于 2009-10-27T04:44:17.560 回答
4

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

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

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

于 2009-10-27T04:07:33.693 回答
1

尝试休眠 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 )

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

于 2009-10-27T04:08:40.803 回答