在 PHP 中,curl_multi_* 函数系列用于同时执行多个 cURL 请求。curl_multi_close() 是这个系列中的一个重要函数,用来关闭由 curl_multi_init() 初始化的多个 cURL 句柄。
curl_multi_* 函数系列是 PHP 中用于并行处理多个 cURL 请求的工具。它们允许你同时发送多个 HTTP 请求,而不需要等待每个请求完成后再发送下一个。通过这种方式,可以显著提高多个请求的处理效率,尤其是在需要请求多个 API 或网站时。
常见的 curl_multi_* 函数有:
curl_multi_init():初始化多个 cURL 句柄。
curl_multi_add_handle():将单个 cURL 句柄添加到 multi 句柄中。
curl_multi_exec():执行多个 cURL 请求。
curl_multi_getcontent():获取某个 cURL 句柄的内容。
curl_multi_close():关闭由 curl_multi_init() 创建的 multi 句柄并释放所有资源。
在使用 curl_multi_* 函数执行多个 cURL 请求时,每个请求都是独立的,且每个请求都有自己的资源消耗。为了确保在请求完成后能够及时释放这些资源,必须调用 curl_multi_close() 来关闭连接。
如果你不使用 curl_multi_close(),这些 cURL 句柄可能会继续占用内存和其他资源,导致性能问题,甚至内存泄漏。因此,在请求完成后,正确关闭这些连接是非常重要的。
下面是一个示例,展示了如何使用 curl_multi_close() 来关闭多个 cURL 连接。
<?php
// 初始化多个 cURL 句柄
$mh = curl_multi_init();
// 定义要请求的 URL 列表
$urls = [
"https://gitbox.net/api/endpoint1",
"https://gitbox.net/api/endpoint2",
"https://gitbox.net/api/endpoint3"
];
// 存储 cURL 句柄
$ch_handles = [];
// 创建每个 cURL 句柄并添加到 multi 句柄中
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$ch_handles[] = $ch;
}
// 执行多个请求
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// 获取每个请求的内容并关闭 cURL 句柄
foreach ($ch_handles as $ch) {
$content = curl_multi_getcontent($ch);
echo $content . "\n"; // 输出返回的内容
curl_multi_remove_handle($mh, $ch);
curl_close($ch); // 关闭每个 cURL 句柄
}
// 关闭 multi 句柄
curl_multi_close($mh);
?>
初始化多个 cURL 句柄:
使用 curl_multi_init() 创建一个新的 multi 句柄,该句柄用于管理多个 cURL 请求。
添加多个 cURL 句柄:
对每个 URL 创建一个 cURL 句柄,设置相关选项,然后通过 curl_multi_add_handle() 将这些句柄添加到 multi 句柄中。
执行请求:
使用 curl_multi_exec() 执行所有请求,直到所有请求完成。
获取内容并关闭句柄:
使用 curl_multi_getcontent() 获取每个 cURL 句柄返回的内容。完成后,通过 curl_multi_remove_handle() 从 multi 句柄中移除该句柄,并使用 curl_close() 关闭每个单独的 cURL 句柄。
关闭 multi 句柄:
最后,调用 curl_multi_close() 来关闭 multi 句柄并释放所有资源。
正确使用 curl_multi_close() 是确保多个 cURL 请求资源被及时释放的关键步骤。在并行处理多个请求时,记得每次执行完请求后,调用 curl_multi_close() 来关闭所有相关的 cURL 连接。这不仅可以防止内存泄漏,还能提升代码的效率。