当前位置: 首页> 最新文章列表> curl_multi_close 用法示例:如何处理并发 HTTP 请求

curl_multi_close 用法示例:如何处理并发 HTTP 请求

gitbox 2025-05-12

在现代 Web 开发中,性能优化一直是重要的课题。尤其是在需要发起多个 HTTP 请求时,如何高效地进行并发管理,直接影响到程序的响应速度和服务器资源的使用效率。PHP 提供了 cURL 扩展,其中 curl_multi_* 系列函数可以帮助开发者同时处理多个请求,大大提升执行效率。

下面我们就来详细了解一下 curl_multi_close 的用法,并结合实际示例,讲解如何正确地管理并发 HTTP 请求。

在 PHP 中,curl_multi_close() 是用于关闭一个 cURL multi handle 的函数。当我们使用 curl_multi_init() 创建了一个 multi handle,并通过 curl_multi_add_handle() 添加了多个单独的 cURL 句柄进行并发处理后,最终需要调用 curl_multi_close() 来释放资源,防止内存泄漏。

基本使用步骤

通常并发请求的完整流程如下:

  1. 初始化 multi handle。

  2. 创建多个 cURL easy handle,并设置对应的 URL 和选项。

  3. 将 easy handle 添加到 multi handle。

  4. 执行 multi handle。

  5. 移除并关闭各个 easy handle。

  6. 最后关闭 multi handle(使用 curl_multi_close())。

示例代码

以下是一个完整的示例,演示了如何正确使用 curl_multi_close() 来管理并发的 HTTP 请求:

<?php

// 待请求的 URL 列表
$urls = [
    'https://gitbox.net/api/data1',
    'https://gitbox.net/api/data2',
    'https://gitbox.net/api/data3',
];

// 初始化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// 初始化每个 cURL easy handle,并添加到 multi handle
foreach ($urls as $i => $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// 执行 multi handle
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($running) {
        // 等待活动连接
        curl_multi_select($multiHandle);
    }
} while ($running > 0);

// 处理返回结果
foreach ($curlHandles as $ch) {
    $content = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);

    echo "请求 URL: " . $info['url'] . PHP_EOL;
    echo "HTTP 状态码: " . $info['http_code'] . PHP_EOL;
    echo "返回内容: " . substr($content, 0, 100) . "..." . PHP_EOL;
    echo str_repeat("-", 50) . PHP_EOL;

    // 移除并关闭 easy handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 关闭 multi handle
curl_multi_close($multiHandle);
?>

重点说明

  • 一定要在所有 easy handle 被移除后,再调用 curl_multi_close()

  • 如果忘记调用 curl_multi_close(),脚本结束时资源可能会被 PHP 自动释放,但这不是好习惯,尤其在长时间运行或高并发环境下,会造成内存泄露。

  • curl_multi_close() 并不会自动关闭已添加的 easy handle,因此在关闭 multi handle 前,需手动移除并关闭各个 easy handle。

小结

通过合理使用 curl_multi_close(),可以确保并发 HTTP 请求管理既高效又安全。记住,在使用 curl_multi 处理完所有请求后,务必清理所有句柄资源,以保持程序的健壮性和性能。