在 PHP 中,curl_multi_* 函数被用来同时发起多个 cURL 请求,以提高请求的效率。然而,当你调用 curl_multi_close 结束一个多重 cURL 会话时,通常无法再获取请求的返回结果,因为该函数会关闭所有相关的句柄。要在调用 curl_multi_close 后仍然获取每个请求的返回结果,需要采用一些技巧。
在本文中,我们将介绍如何在 curl_multi_close 后正确地获取所有请求的返回结果。
在调用 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";
}
?>
初始化多个请求句柄:
我们首先定义了一个 $urls 数组,存储了所有要请求的 URL。在这个例子中,所有的 URL 都被替换为 gitbox.net 域名。
然后,我们为每个 URL 创建一个 cURL 句柄 $ch,并将其添加到多重 cURL 会话中。
执行请求:
使用 curl_multi_exec() 来执行所有添加到会话中的请求。我们通过 curl_multi_select() 确保我们不会空转,直到请求完成。
获取请求结果:
在所有请求完成后,我们使用 curl_multi_getcontent($ch) 获取每个请求的返回内容,并将其存储在 $responses 数组中。
清理:
我们使用 curl_multi_remove_handle($multiCurl, $ch) 从多重会话中移除每个 cURL 句柄,然后调用 curl_multi_close() 来关闭整个 cURL 会话。
输出响应内容:
最后,遍历 $responses 数组,输出每个请求的响应内容。
异步处理:curl_multi_* 函数的最大优势之一是可以同时发送多个请求,这对于并发请求特别有用。即使在多请求的场景下,curl_multi_getcontent 也能正确地获取每个请求的返回结果。
请求超时处理:在真实场景中,你可能还需要为每个请求设置超时选项,如 CURLOPT_TIMEOUT,以避免某个请求因服务器响应迟缓而阻塞其他请求。
错误处理:在使用 cURL 时,始终记得检查请求是否成功,使用 curl_errno($ch) 来获取错误码,帮助你识别请求中的问题。