cURL,是curl_multi_init多线程还是异步API?

时间:2015-06-07 11:53:22

标签: php curl

我的问题很简单,cURL的curl_multi_init实际上是多线程还是只使用异步API?谢谢!

2 个答案:

答案 0 :(得分:1)

cURL是一个非常古老的库,真正的异步代码是一个相对较新的概念。 libcurl是用C语言编写的,因此每个请求都是阻塞的。虽然您可以并行处理多个请求,但对于您的程序来说,这绝对不是异步的,因为您必须等到最长的请求完成:

while((curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);

那就是说,我仍然相信cURL是最好的解决方案。实现此功能的其他库通常也使用curl,它们只是添加回调,以便在每个单独的请求完成后立即处理数据,而不是等待它们全部然后达到100%CPU以在最后处理所有内容。 / p>

问题是curl_multi的大多数实现在处理它们之前等待每组请求完成。如果一次请求处理的请求太多,它们通常会分组,然后一次处理一个。这个问题是每个组都必须等待最慢的下载请求。在一组100个请求中,只需要一个缓慢的延迟处理99个其他请求。您处理的请求数越多,此延迟就越明显。

解决方案是在完成后立即处理每个请求。这消除了繁忙等待时浪费的CPU周期。我还创建了一个cURL请求队列,以允许最大吞吐量。每次请求完成后,从队列中添加一个新请求。通过动态添加和删除链接,我们始终保持一定数量的链接下载。这为我们提供了一种方法来限制我们发送的同时请求的数量。结果是以更快,更有效的方式并行处理大量cURL请求。

  

RollingCurlX Rolling Curl X是Rolling Curl包装器cURL Multi的一个分支。它的目的是尽可能简化PHP中的并发http请求。
  RollingCurl for PHP(未在5年内更新)

答案 1 :(得分:-1)

http://php.net/manual/en/function.curl-multi-init.php

  

允许异步处理多个cURL句柄。