1. 速度控制
1.1 php代码方式
function http_request($URI)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URI);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//速度控制
$speed = 100000;
curl_setopt($ch, CURLOPT_MAX_RECV_SPEED_LARGE, 100000);
$result = curl_exec($ch);
if (!$result){
echo curl_error($ch);
return false;
}
curl_close($ch);
return $result;
}
$url = "http://toutiao.sogoucdn.com/ykvideo/20181130/0575139af28f38c336912739acf33a88.mp4";
$res = http_request($url);
file_put_contents("./video", $res);
说明:
- CURLOPT_MAX_RECV_SPEED_LARGE,即是控制下载速度的参数,数值单位为byte。上例中,我们期望的速度为100k(byte)。
- 网速其实指的是bit, 所以100k byte对应的网速是800k bit。 需要注意下这里的换算关系。
1.2 命令行方式
curl "http://toutiao.sogoucdn.com/ykvideo/20181130/0575139af28f38c336912739acf33a88.mp4" -o video --limit-rate 100k
说明:
- –limit-rate就是命令行curl控制速度的参数。
- 速度单位仍然是byte。
2. 速度测定
我们使用iftop对网卡的下载速度进行测定,以观测控速是否起到了应有的效果。不了解iftop的同学,可以点击这里。
2.1 php方式
运行1.1中的代码,我们在iftop中看到如下记录:
10.144.73.171 => 111.202.99.142 6.56Kb 6.78Kb 6.76Kb
<= 1.02Mb 1.00Mb 0.99Mb
平均下载速度在900kb~1.1M(bit)之间波动。
2.2 shell方式
iftop中看到记录如下:
10.144.73.171 => 111.202.99.191 6.72Kb 6.59Kb 6.81Kb
<= 1.04Mb 1.04Mb 1.04Mb
平均下载速度在850kb~1.1M(bits)之间波动。与代码方式基本一致。
3.3 结论
- 使用命令行curl ,和php curl均可对下载速度进行控制。
- 速度的控制并不能做到很精确,只能保证下载平均速度在预期值附近。实测中发现,个别时点可能会突破预期值很多。
- 设定的速率越低,速度波动会越大。比如限定速度为1k bit, 实际观察到的速度波动会在320b~50kb之间。显然波动高于上例中限定速率为800k bit的情况。
- 不同工具使用的单位不同, 注意byte与bit的转换。