目的
根据已知的带宽(如后台给用户分配的),限制用户下载速度。
方法
循环读取固定大小文件。根据每次读取大小和带宽计算出每次循环需要sleep的时间。由于时间较小,使用usleep函数 – 以指定的微秒数延迟执行;
CODE
header('Content-Length: ' . $fileSize);
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: filename*="'.$fileName.'"');
$fp = fopen('./1.txt', "rb");
if($fp) {
set_time_limit(0);
$bindWidth = 10 * 1024 * 1024; // 10Mbps 带宽
$readPer = 1024 * 8; //每次读取文件大小 8kb
//每次读取需延迟时间: 将文件Byte转为bit,同带宽单位一致. 乘以10的6次方是为了将秒转换为微秒
$sleepTime = round(($readPer * 8 / $bindWidth) * pow(10, 6));
while (!feof($fp)) {
usleep($sleepTime);
echo fread($fp, $readPer);
flush();
ob_flush();
}
}