来自CURL请求的流响应,无需等待它完成

时间:2011-12-02 20:46:04

标签: php curl

我的服务器上有一个PHP脚本,它正在向另一台服务器请求图像。

访问脚本就像这样的常规图像源:

<img src="http://example.com/imagecontroller.php?id=1234" />

浏览器 - &gt;脚本 - &gt;外部服务器

脚本正在向外部服务器发送CURL请求。

是否可以将CURL响应直接“流式传输”回服务器上的客户端(浏览器)?

假设我的脚本位于慢速共享托管服务器上,外部服务器速度非常快(CDN)。有没有办法在没有我的脚本成为瓶颈的情况下直接将响应提供给客户端?如果我的服务器在开始响应客户端之前不必等待将整个映像加载到内存中,那就太棒了。

4 个答案:

答案 0 :(得分:9)

-N / --no-buffer标记传递给curl。它执行以下操作:

  

禁用缓冲输出流。在正常的工作中   在情况下,curl将使用标准的缓冲输出流   有效的是它会以块的形式输出数据,而不是   必须完全在数据到达时。使用此选项将   禁用缓冲。

     

请注意,这是记录的否定选项名称。你可以这样使用    - 缓冲来强制执行缓冲。

答案 1 :(得分:1)

查看Pascal Martin对一个不相关问题的回答,其中他讨论了使用CURLOPT_FILE进行流式卷曲响应。他对处理“Manipulate a string that is 30 million characters long”的解释应该适用于你的情况。

希望这有帮助!

答案 2 :(得分:1)

是的,您可以使用CURLOPT_WRITEFUNCTION标志:

curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);

其中$ch是Curl处理程序,而$callback是回调函数名称。 此命令将流式传输来自远程站点的响应数据。回调函数可能类似于:

$result = '';
$callback = function ($ch, $str) {
global $result;
$result .= $str;//$str has the chunks of data streamed back. 
//here you can mess with the stream data either with $result or $str
return strlen($str);//don't touch this
};

如果未在结尾处中断,$result将包含来自远程站点的所有响应。

答案 3 :(得分:0)

不使用curl,你可以使用fsocket进行流式传输。