什么是对PHP脚本发出CURL请求的异步请求的限制

时间:2012-09-11 22:42:24

标签: php curl asynchronous

正如标题所述:对于发出PHP请求并返回某些信息的CURL脚本可以进行的异步请求的数量是多少,或者如果硬件依赖,则是近似数字。

例如:

一段Javascript在循环中运行50次,通过AJAX将异步获取请求发送到同一个PHP脚本,并在返回时将结果存储在数组中。

可以合理地做出多少此类请求,或者服务器一次只能考虑一个CURL请求?

1 个答案:

答案 0 :(得分:3)

您正在寻找的是curl_multi_*功能。一个例子是这样的:

//create the multiple cURL handle
$mh = curl_multi_init();

// Loop over pages and get set the URL to the cURL queue
foreach ($urls as $url) {

    // Get a cURL handle of the current URL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    // Set all your other curl_setopt() options here for the transfers


    // Success
    if (gettype($ch) == 'resource' && get_resource_type($ch) == 'curl') {
        curl_multi_add_handle($mh, $ch);
    }
}

// Execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

我在我的一个网站上使用它来下载大约50个网址,它完美无缺。当然,这一切都取决于脚本的已分配内存。您还可以设置超时,以便没有URL可以使您的脚本挂起太长时间。

编辑:要实际回答您的问题,我不确定您可以输入此功能的网址数量限制是多少。我相信它会因服务器而异,具体取决于连接速度,内存以及可能的CPU,如果你正在对处理器密集的事情进行处理。但话虽如此,如果所有请求都发送到同一个远程服务器,您可能会遇到瓶颈问题,具体取决于其配置。这与您使用PHP多个cURL请求还是使用AJAX无关。即使是同一个脚本,所有Web服务器都可以处理许多并发请求,但您仍然可以遇到以下任何一种情况的问题:

  • 发送的每个请求都非常耗费资源
  • 远程服务器需要锁定数据库,在这种情况下,所有请求都将逐个执行,因此一次或一次发送所有请求的差别很小。
  • 远程服务器在PHP中使用基于文件的会话,而您的请求需要会话
  • 远程服务器设置为允许极少数最大并发客户端(通常Nginx处理许多并发客户端比Apache更好,因为它不需要为每个请求分叉一个新进程,所以如果它成为你可能想要的问题研究切换Web服务器)。在这种情况下,所有后续请求将排队到一定的硬限制金额,超过该限额,它们将被删除。