Php MySQL文件下载速度限制

Php MySQL文件下载速度限制,php,mysql,Php,Mysql,我的所有文件都以BLOB的形式存储在mysql数据库中。我试图增加一个速度限制,用户可以通过我们的PHP网站下载它们。我尝试过使用“睡眠(1);”方法,它似乎不起作用,或者我做得不对。所以如果有人知道限制速度的方法,我会很乐意你的帮助 这是我的下载代码 $query=mysql_query("SELECT * FROM file_servers WHERE id='$file_server_id'"); $fetch=mysql_fetch_assoc($quer

我的所有文件都以BLOB的形式存储在mysql数据库中。我试图增加一个速度限制,用户可以通过我们的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;
        }
$query=mysql\u query(“从文件服务器中选择*,其中id=”$file\u server\u id');
$fetch=mysql\u fetch\u 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\u server\u ip.:“$file\u server\u port;
if(!$linkid=@mysql\u connect($connectto、$file\u server\u username、$file\u server\u password,true))
{
死(“无法连接到存储服务器!”);
}
如果(!mysql\u select\u db($file\u server\u db,$linkid))
{
死(“无法连接到存储数据库!”);
}
$nodelist=array();
//拉取文件索引节点列表
$SQL=“从文件\u数据中选择id,其中文件\u id='$file\u id'按id排序”;
if(!$RES=mysql\u查询($SQL,$linkid))
{
die(“未能检索文件索引节点列表”);
}
而($CUR=mysql\u fetch\u object($RES))
{
$nodelist[]=$CUR->id;
}
//将标题向下发送到客户端
标题(“内容类型:$data_Type”);
标题(“内容长度:$size”);
标题(“内容处置:附件;文件名=$name”);
//循环通过并以1:1的方式传输节点
对于($Z=0;$Zfile\u data;
}

它位于代码的最后一行,您希望在那里实现throgging。我不熟悉php是否支持througging输出

如果没有,您可以尝试分割您希望回显的内容(
$DataObj->file\u data
),并在其间稍作停顿,一点一点地回显


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

实现此目的的一种方法可能是结合使用和睡眠:

  • 从数据库中读取部分内容
  • 输出一些字节
  • 将输出刷新到用户
  • 睡一秒钟
但也可以在油门功能中获得战利品:
这里也有一个例子。我认为它更适合。

这不是限制internet连接的方式,也不是DB引擎的用途。我建议阅读正确的技术来实现这一点(这取决于您需要什么)。您应该切换到
PDO
mysqli
。第二,你应该用他们最擅长的东西。文件系统非常适合存储文件,数据库非常适合存储数据。你可以存储一个文件名,这样你就知道从文件系统中检索哪个文件了。谢谢你,我试着用fluch睡眠,你说过要使用ob_flush的链接,这使它工作了。:)