1

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

例如:

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

可以合理地发出多少这样的请求,或者服务器一次只能考虑一个CURL请求?

4

1 回答 1

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,它运行良好。当然,这完全取决于为您的脚本分配的内存。您还可以设置超时,以便没有任何 URL 可以使您的脚本挂起太久。

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

  • 发送的每个请求都非常消耗资源
  • 远程服务器需要锁定数据库,这种情况下所有的请求都会一个一个的执行,所以一次发送或者一次发送没有什么区别。
  • 远程服务器在 PHP 中使用基于文件的会话,您的请求需要会话
  • 远程服务器设置为允许很少的最大并发客户端(通常 Nginx 处理许多并发客户端比 Apache 更好,因为它不需要为每个请求派生一个新进程,所以如果它成为一个问题,你可能想要调查切换网络服务器)。在这种情况下,所有后续请求都将排队到某个硬限制数量,超过该数量,它们将被丢弃。
于 2012-09-11T23:03:52.830 回答