当前位置: 首页> 最新文章列表> curl_multi_close 与 curl_multi_add_handle 的正确配合

curl_multi_close 与 curl_multi_add_handle 的正确配合

gitbox 2025-05-29

在开发中,我们可能会遇到需要同时发起多个 HTTP 请求的情况。PHP 的 cURL 库提供了一种非常方便的方法来并行发起多个 HTTP 请求,这就是 curl_multi_* 函数。curl_multi_add_handlecurl_multi_close 是这类操作中的两个关键函数。本文将介绍如何正确使用它们来进行多重 cURL 请求管理。

1. cURL 简介

cURL 是一种用于向服务器发送请求并获取响应的工具,它支持多种协议,如 HTTP、HTTPS、FTP 等。在 PHP 中,cURL 可以通过一系列的函数进行操作,最常用的包括 curl_initcurl_setoptcurl_exec

2. curl_multi_add_handle 的使用

curl_multi_add_handle 函数用于将多个 cURL 会话句柄添加到多重 cURL 处理池中。这使得我们能够并行地处理多个请求,从而提高效率,尤其是在需要发送多个 HTTP 请求时。

示例代码:

// 初始化多个 cURL 会话
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');

// 设置各个 cURL 请求的选项
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 初始化多重 cURL 句柄
$multiHandle = curl_multi_init();

// 将 cURL 句柄添加到多重 cURL 句柄中
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);

// 执行请求
do {
    $status = curl_multi_exec($multiHandle, $active);
    if ($active) {
        // 等待有活动请求完成
        curl_multi_select($multiHandle);
    }
} while ($active && $status == CURLM_OK);

// 获取响应数据
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 输出结果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";

// 关闭每个 cURL 会话
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);

在上面的代码中,curl_multi_add_handle 将两个 cURL 句柄 $ch1$ch2 添加到多重 cURL 句柄 $multiHandle 中,然后通过 curl_multi_exec 执行这些请求。curl_multi_select 会等待请求的完成,从而实现并行处理。

3. curl_multi_close 的使用

当所有请求完成后,我们需要关闭多重 cURL 句柄。此时使用 curl_multi_close 函数。这个函数会释放与 curl_multi_init 创建的句柄相关的资源。

示例代码:

// 完成请求后关闭多重 cURL 句柄
curl_multi_close($multiHandle);

使用 curl_multi_close 后,系统会清理与多重 cURL 句柄相关的所有资源。注意,在关闭多重 cURL 句柄之前,必须先移除所有添加的 cURL 句柄,否则会发生资源泄漏。

4. 综合示例

以下是一个完整的示例,演示如何使用 curl_multi_add_handlecurl_multi_close 进行多个 HTTP 请求的管理:

// 初始化多个 cURL 会话
$ch1 = curl_init('https://gitbox.net/api/resource1');
$ch2 = curl_init('https://gitbox.net/api/resource2');

// 设置 cURL 选项
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 初始化多重 cURL 句柄
$multiHandle = curl_multi_init();

// 添加 cURL 会话到多重处理池
curl_multi_add_handle($multiHandle, $ch1);
curl_multi_add_handle($multiHandle, $ch2);

// 执行多重请求
do {
    $status = curl_multi_exec($multiHandle, $active);
    if ($active) {
        curl_multi_select($multiHandle); // 等待请求完成
    }
} while ($active && $status == CURLM_OK);

// 获取返回内容
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 输出请求结果
echo "Response from resource1: $response1\n";
echo "Response from resource2: $response2\n";

// 移除 cURL 会话
curl_multi_remove_handle($multiHandle, $ch1);
curl_multi_remove_handle($multiHandle, $ch2);

// 关闭多重 cURL 句柄
curl_multi_close($multiHandle);

这个代码完整地展示了如何并行发起多个 HTTP 请求,并在请求完成后关闭多重 cURL 句柄。