当前位置: 首页> 最新文章列表> 如何在一个脚本中使用 curl_close 结束多个并发请求?

如何在一个脚本中使用 curl_close 结束多个并发请求?

gitbox 2025-05-26

在使用 PHP 处理并发 HTTP 请求时,cURL 是一个非常常用且强大的工具。为了提高效率,我们通常使用 curl_multi_* 系列函数发起多个并发请求。而在完成所有请求后,正确地关闭每一个请求句柄是非常重要的,这正是 curl_close() 的作用所在。本文将详细讲解如何在一个 PHP 脚本中配合 curl_multi_exec() 使用 curl_close() 来结束多个并发请求。

基础准备:发起多个请求

首先,我们需要创建多个 cURL 句柄,并通过 curl_multi_add_handle() 添加到一个多句柄资源中。

$urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

在这段代码中,我们将三个 URL 添加为三个独立的 cURL 请求句柄,并将它们加入到一个多句柄资源 $multiHandle 中。

执行并发请求

添加所有句柄后,我们通过 curl_multi_exec()curl_multi_select() 来处理这些请求的执行:

$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

这个循环会持续运行直到所有并发请求完成。curl_multi_exec() 实际发起请求,curl_multi_select() 则用于等待活动连接,避免 CPU 空转。

获取响应内容(可选)

执行完成后,你可能想获取每一个请求的返回结果:

$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
}

关闭句柄:使用 curl_close()

请求完成后,我们需要确保所有的资源都被释放,包括每一个 cURL 请求句柄和多句柄资源本身。这就是 curl_close() 发挥作用的地方:

foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);

上述代码中,我们逐个使用 curl_multi_remove_handle() 将每个句柄从多句柄资源中移除,然后使用 curl_close() 关闭它们,最后关闭多句柄资源本身。

小结

使用 curl_close() 正确释放资源是处理并发请求后不可忽略的步骤。以下是完整的处理流程总结:

  1. 初始化多个 cURL 请求句柄;

  2. 将句柄加入多句柄资源;

  3. 使用 curl_multi_exec() 处理并发请求;

  4. 使用 curl_multi_getcontent() 获取结果(可选);

  5. 使用 curl_close()curl_multi_close() 关闭所有句柄和资源。

通过以上方法,你可以在一个 PHP 脚本中高效且优雅地管理多个并发请求,确保系统资源不被浪费。