流媒体文件时CURL比fread慢吗?如何加速CURL

时间:2013-10-17 05:25:57

标签: php curl stream fread

我正在尝试制作一个脚本来下载文件的一部分。 只需用CURL和fread进行测试,我意识到流式传输过程中的CURL比fread慢。 为什么?如何加快curl流文件的速度? 我不喜欢使用fread,fopen因为我在流媒体播放过程中需要有限的时间。

这是我的示例代码。

$start = microtime(true);
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
$response = fread($f, 3); echo $response.'<br>';
$response = fread($f, 3); echo $response.'<br>';
$response = fread($f, 3); echo $response.'<br>';
$response = fread($f, 3); echo $response.'<br>';
$response = fread($f, 3); echo $response.'<br>';

$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();

fread / fopen只花了1.1秒

$start = microtime(true);
$curl = curl_init('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg');
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_RANGE, "0-2");
$response = curl_exec($curl);echo $response.'<br>';

curl_setopt($curl, CURLOPT_RANGE, "3-5");
$response = curl_exec($curl);echo $response.'<br>';

curl_setopt($curl, CURLOPT_RANGE, "6-8");
$response = curl_exec($curl);echo $response.'<br>';

curl_setopt($curl, CURLOPT_RANGE, "9-11");
$response = curl_exec($curl);echo $response.'<br>';

curl_setopt($curl, CURLOPT_RANGE, "12-14");
$response = curl_exec($curl);echo $response.'<br>';
curl_close($curl);

$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();
卷曲需要大约2.5秒。 如果我采取更多步骤下载更多的文件的一部分。 卷曲会慢一些。

为什么卷曲会变慢?它是什么解决方案?

5 个答案:

答案 0 :(得分:3)

它总是较慢,因为您添加了额外的HTTP调用往返。每个curl_exec都是一个HTTP请求。

答案 1 :(得分:2)

你的问题是关于同一请求的许多部分请求或增量缓冲读取。

fopen / fread实现会触发一个HTTP请求并多次读取它。

另一方面,

curl实现会触发许多HTTP请求,每个请求一个请求(see partial range requests)。 所以我们比较苹果和橘子

公平地说fopen / fread看起来像这样

$start = microtime(true);
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
$response = fread($f, 3); echo $response.'<br>';
fclose($f)
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
fseek($f, 3);
$response = fread($f, 3); echo $response.'<br>';
fclose($f)
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
fseek($f, 6);
$response = fread($f, 3); echo $response.'<br>';
fclose($f)
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
fseek($f, 9);
$response = fread($f, 3); echo $response.'<br>';
fclose($f)
$f = fopen('http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg','r');
fseek($f, 12);
$response = fread($f, 3); echo $response.'<br>';
fclose($f)
$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();

更新:我改写了我的回答

答案 2 :(得分:1)

您可以使用curl_getinfo查看需要很长时间的内容。

缓慢可能是由于curl库的DNS查找造成的。 您是否尝试过为请求网址使用IP地址而不是域名?

编辑:或者,您可以将CURLOPT_DNS_USE_GLOBAL_CACHE设置为 true 并将CURLOPT_DNS_CACHE_TIMEOUT设置为更长的值(例如1小时) - 这是2分钟默认情况下。

Src:http://php.net/manual/en/function.curl-setopt.php

答案 3 :(得分:0)

尝试在Keep-Alive之前设置curl_exec标头,例如以这种方式设置300秒:

$headers = array("Keep-Alive: 300");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

答案 4 :(得分:0)

您可以尝试以下解决方案:

curl_setopt($curl, CURLOPT_RANGE, "0-2, 3-5, 6-8, 9-11, 12-14");
$response = curl_exec($curl);echo $response.'<br>';
curl_close($curl);
$stop = round(microtime(true) - $start, 5);
echo "{$stop}s";
exit();