MySQL文件下载速度限制

时间:2013-06-07 21:42:14

标签: php mysql

我将所有文件存储在mysql数据库中作为blob。我试图为用户可以通过我们的PHP网站下载它们的速率添加速度限制。我试过用“睡觉(1);”方法,似乎没有用,或者我做得不对。所以如果有人知道限制速度的方法,我会很乐意帮助你。

这是我的下载代码

        $query=mysql_query("SELECT * FROM file_servers WHERE id='$file_server_id'");
        $fetch=mysql_fetch_assoc($query);
        $file_server_ip=$fetch['ip'];
        $file_server_port=$fetch['port'];
        $file_server_username=$fetch['username'];
        $file_server_password=$fetch['password'];
        $file_server_db=$fetch['database_name'];
        $connectto=$file_server_ip.":".$file_server_port;
        if (!$linkid = @mysql_connect($connectto, $file_server_username, $file_server_password, true))
        {
            die("Unable to connect to storage server!");
        }
        if (!mysql_select_db($file_server_db, $linkid))
        {
            die("Unable to connect to storage database!");
        }
        $nodelist = array();
        // Pull the list of file inodes
        $SQL = "SELECT id FROM file_data WHERE file_id='$file_id' order by id";
        if (!$RES = mysql_query($SQL, $linkid))
        {
            die("Failure to retrive list of file inodes");
        }
        while ($CUR = mysql_fetch_object($RES))
        {
            $nodelist[] = $CUR->id;
        }
        // Send down the header to the client
        header("Content-Type: $data_type");
        header("Content-Length: $size");
        header("Content-Disposition: attachment; filename=$name");
        // Loop thru and stream the nodes 1 by 1
        for ($Z = 0 ; $Z < count($nodelist) ; $Z++)
        {
            $SQL = "select file_data from file_data where id = " . $nodelist[$Z];
            if (!$RESX = mysql_query($SQL, $linkid))
            {
                die("Failure to retrive file node data");
            }
            $DataObj = mysql_fetch_object($RESX);
            echo $DataObj->file_data;
        }

2 个答案:

答案 0 :(得分:0)

它位于您希望实现throtling的代码中的最后一个echo行中。我不熟悉php是否支持throtling输出。

如果没有,你可以试着将那些你希望回应的内容($DataObj->file_data)分开,然后一点一点地回应它,中间有一些小暂停

并确保禁用outbut缓冲。否则在完成整个脚本之前,不会输出你回复的所有内容。

答案 1 :(得分:0)

这样做的一种方法可能是flush和睡眠:

的组合
  • 阅读从数据库
  • 获得的部分内容
  • 输出一些字节
  • 将输出刷新给用户
  • 睡1秒

但是也可以在油门功能上获取战利品: http://php.net/manual/en/function.http-throttle.php 它也有一个例子。我觉得它更适合。