在开发中,我们可能会遇到需要同时发起多个 HTTP 请求的情况。PHP 的 cURL 库提供了一种非常方便的方法来并行发起多个 HTTP 请求,这就是 curl_multi_* 函数。curl_multi_add_handle 和 curl_multi_close 是这类操作中的两个关键函数。本文将介绍如何正确使用它们来进行多重 cURL 请求管理。
cURL 是一种用于向服务器发送请求并获取响应的工具,它支持多种协议,如 HTTP、HTTPS、FTP 等。在 PHP 中,cURL 可以通过一系列的函数进行操作,最常用的包括 curl_init、curl_setopt 和 curl_exec。
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 会等待请求的完成,从而实现并行处理。
当所有请求完成后,我们需要关闭多重 cURL 句柄。此时使用 curl_multi_close 函数。这个函数会释放与 curl_multi_init 创建的句柄相关的资源。
// 完成请求后关闭多重 cURL 句柄
curl_multi_close($multiHandle);
使用 curl_multi_close 后,系统会清理与多重 cURL 句柄相关的所有资源。注意,在关闭多重 cURL 句柄之前,必须先移除所有添加的 cURL 句柄,否则会发生资源泄漏。
以下是一个完整的示例,演示如何使用 curl_multi_add_handle 和 curl_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 句柄。