0

我将所有文件作为 blob 存储在 mysql 数据库中。我正在尝试为用户可以通过我们的 PHP 网站下载它们的速率添加速度限制。我尝试使用“sleep(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;
        }
4

2 回答 2

0

它位于代码的最后一个回显行中,您希望在其中实现节流。我不熟悉 php 是否支持节流输出。

如果没有,您可以尝试拆分$DataObj->file_data您想要回显的内容(),然后一点一点地回显它,中间有小停顿

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

于 2013-06-07T21:51:53.250 回答
0

这样做的一种方法可能是冲洗和睡眠的组合:

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

但也可以在油门功能上抢夺:http: //php.net/manual/en/function.http-throttle.php 它也有一个例子。我认为它更适合。

于 2013-06-07T21:57:26.867 回答