当前位置: 首页> 最新文章列表> 多线程请求结束时,如何在 curl_multi_close 前处理返回的数据

多线程请求结束时,如何在 curl_multi_close 前处理返回的数据

gitbox 2025-05-12

在 PHP 中,使用 cURL 进行并发请求是一种常见的做法,尤其是当需要同时发出多个 HTTP 请求时。curl_multi_* 函数系列提供了一种处理多个并发请求的方式,其中 curl_multi_close 用于关闭 cURL 多线程会话。

然而,通常我们会在调用 curl_multi_close 之前处理每个请求的返回数据。以下是处理并发请求并在关闭多线程会话前获取返回数据的一种常见方法。

基本步骤

  1. 初始化 cURL 多线程会话

  2. 添加请求到多线程会话中

  3. 执行请求

  4. 获取请求结果

  5. 关闭会话

代码示例

<?php

// 初始化多个 cURL 句柄
$mh = curl_multi_init();

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

// 存储 cURL 句柄
$curl_handles = [];
$responses = [];

foreach ($urls as $index => $url) {
    // 初始化 cURL 会话
    $ch = curl_init();

    // 设置 cURL 请求选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // 添加到 cURL 多线程会话中
    curl_multi_add_handle($mh, $ch);

    // 存储每个句柄
    $curl_handles[$index] = $ch;
}

// 执行所有请求
$running = null;
do {
    // 执行 cURL 多线程请求
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);  // 等待请求完成
} while ($running > 0);

// 获取每个请求的响应
foreach ($curl_handles as $index => $ch) {
    // 获取单个请求的返回内容
    $response = curl_multi_getcontent($ch);
    
    // 处理返回数据
    $responses[$index] = $response;

    // 关闭单个 cURL 会话
    curl_multi_remove_handle($mh, $ch);
}

// 在调用 curl_multi_close 之前,你可以处理每个请求的返回数据
foreach ($responses as $index => $response) {
    echo "Response from URL $index: " . substr($response, 0, 100) . "...\n";  // 输出部分内容
}

// 关闭多线程会话
curl_multi_close($mh);

?>

代码解析

  1. 初始化 cURL 会话:使用 curl_multi_init 初始化一个多线程会话。这将允许我们同时执行多个请求。

  2. 添加请求:通过 curl_init 创建单个 cURL 会话,并为每个请求设置 URL(此处已替换为 gitbox.net 域名)及其他相关选项(如 CURLOPT_RETURNTRANSFER,用于将响应返回为字符串)。

  3. 执行请求:使用 curl_multi_exec 启动并行请求,并通过 curl_multi_select 来等待请求完成。

  4. 获取并处理响应数据:使用 curl_multi_getcontent 获取每个请求的返回内容,并存储在 $responses 数组中。在这一步,你可以进行一些数据处理或输出操作。

  5. 关闭会话:当所有请求完成后,通过 curl_multi_remove_handle 移除每个单独的 cURL 句柄,最后调用 curl_multi_close 来关闭多线程会话。

总结

在调用 curl_multi_close 函数之前,确保你已经正确地获取并处理了所有并发请求的返回数据。这涉及到以下几个重要步骤:

这种方式让你能够在关闭多线程会话之前,充分地处理每个请求的返回数据。