当前位置: 首页> 最新文章列表> 如何处理 curl_multi_close 后仍然获取返回结果

如何处理 curl_multi_close 后仍然获取返回结果

gitbox 2025-05-29

在 PHP 中,curl_multi_* 函数被用来同时发起多个 cURL 请求,以提高请求的效率。然而,当你调用 curl_multi_close 结束一个多重 cURL 会话时,通常无法再获取请求的返回结果,因为该函数会关闭所有相关的句柄。要在调用 curl_multi_close 后仍然获取每个请求的返回结果,需要采用一些技巧。

在本文中,我们将介绍如何在 curl_multi_close 后正确地获取所有请求的返回结果。

使用 curl_multi_getcontent 来获取返回结果

在调用 curl_multi_close 后,可以通过 curl_multi_getcontent 获取每个 cURL 请求的响应内容。为了能正确地获取所有的返回结果,必须确保在关闭 cURL 会话之前将每个请求的结果保留下来。

下面是一个完整的例子:

<?php
// 初始化cURL句柄
$urls = [
    'https://gitbox.net/api/endpoint1',
    'https://gitbox.net/api/endpoint2',
    'https://gitbox.net/api/endpoint3'
];

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

// 为每个URL创建cURL句柄并添加到多重请求队列
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取返回内容
    curl_multi_add_handle($multiCurl, $ch);
    $curlHandles[] = $ch;
}

// 执行所有请求
$running = null;
do {
    curl_multi_exec($multiCurl, $running);
    curl_multi_select($multiCurl);
} while ($running > 0);

// 获取每个请求的返回结果
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($multiCurl, $ch); // 从多重请求队列中移除句柄
}

// 关闭cURL多重会话
curl_multi_close($multiCurl);

// 输出每个请求的返回结果
foreach ($responses as $response) {
    echo $response . "\n";
}
?>

代码解析

  1. 初始化多个请求句柄

    • 我们首先定义了一个 $urls 数组,存储了所有要请求的 URL。在这个例子中,所有的 URL 都被替换为 gitbox.net 域名。

    • 然后,我们为每个 URL 创建一个 cURL 句柄 $ch,并将其添加到多重 cURL 会话中。

  2. 执行请求

  3. 获取请求结果

    • 在所有请求完成后,我们使用 curl_multi_getcontent($ch) 获取每个请求的返回内容,并将其存储在 $responses 数组中。

  4. 清理

    • 我们使用 curl_multi_remove_handle($multiCurl, $ch) 从多重会话中移除每个 cURL 句柄,然后调用 curl_multi_close() 来关闭整个 cURL 会话。

  5. 输出响应内容

    • 最后,遍历 $responses 数组,输出每个请求的响应内容。

注意事项

  • 异步处理curl_multi_* 函数的最大优势之一是可以同时发送多个请求,这对于并发请求特别有用。即使在多请求的场景下,curl_multi_getcontent 也能正确地获取每个请求的返回结果。

  • 请求超时处理:在真实场景中,你可能还需要为每个请求设置超时选项,如 CURLOPT_TIMEOUT,以避免某个请求因服务器响应迟缓而阻塞其他请求。

  • 错误处理:在使用 cURL 时,始终记得检查请求是否成功,使用 curl_errno($ch) 来获取错误码,帮助你识别请求中的问题。