从CURL请求流响应,而不等待它完成


Stream response from CURL request without waiting for it to finish

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

脚本的访问方式与常规图像源一样,如下所示:

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

浏览器->脚本->外部服务器

脚本正在向外部服务器执行CURL请求。

是否有可能在服务器上接收到CURL响应时直接"流"回客户端(浏览器)?

假设我的脚本在一个慢的共享主机服务器上,而外部服务器非常快(CDN)。是否有一种方法可以直接将响应返回给客户端,而不会使我的脚本成为瓶颈?如果我的服务器在开始响应客户端之前不必等待整个图像加载到内存中,那就太好了。

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

禁用输出流的缓冲。在正常工作中在这种情况下,curl将使用标准的缓冲输出流它会以块的形式输出数据,不是吗必须准确地在数据到达的时候。使用此选项将禁用缓存

注意,这是文档中被否定的选项名。因此,您可以使用——buffer强制缓冲

查看Pascal Martin对一个不相关问题的回答,他在其中讨论了使用CURLOPT_FILE来流式传输curl响应。他对处理"操纵一个3000万字符长的字符串"的解释应该适用于你的情况。

希望这对你有帮助!

可以使用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将包含来自远程站点的所有响应。

不使用curl,您可以使用fsocket来执行流。