当前位置: 首页> 最新文章列表> 结合 curl_exec 和 curl_multi_close 使用的最佳实践

结合 curl_exec 和 curl_multi_close 使用的最佳实践

gitbox 2025-05-29

在开发中,我们经常需要向多个服务器或API发起HTTP请求。如果按照传统的单线程方式,一个一个地请求,不仅慢,还浪费服务器资源。PHP提供了cURL扩展,其中curl_multi_execcurl_multi_close函数可以让我们实现多请求并发处理,大大提高效率。

本文将详细介绍如何使用curl_exec结合curl_multi_close进行高效的并发处理,并给出具体的示例代码。

基本概念

  • curl_exec():执行单个cURL请求。

  • curl_multi_exec():同时执行多个cURL句柄。

  • curl_multi_close():关闭一个cURL批处理句柄,释放资源。

如果需要并发处理大量请求,推荐使用curl_multi_exec,而非为每个请求单独调用curl_exec。而curl_multi_close则是在全部请求处理完毕后,清理资源的重要步骤。

示例代码

下面是一个简单示例,演示如何并发请求多个接口,并处理响应:

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

// 初始化多个cURL句柄
$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

// 执行所有请求
$running = null;
do {
    $status = curl_multi_exec($multiHandle, $running);
    if ($status > 0) {
        // 有错误发生
        echo "cURL error: " . curl_multi_strerror($status);
        break;
    }
    // 等待活动连接
    curl_multi_select($multiHandle);
} while ($running > 0);

// 处理每个请求的响应
foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    $info = curl_getinfo($ch);
    if (curl_errno($ch)) {
        echo 'Request Error: ' . curl_error($ch) . PHP_EOL;
    } else {
        echo 'HTTP Code: ' . $info['http_code'] . PHP_EOL;
        echo 'Response: ' . $response . PHP_EOL;
    }
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

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

说明

  • 首先通过curl_multi_init()创建一个多句柄。

  • 将每个cURL单独设置后,通过curl_multi_add_handle()加入到multi handle中。

  • 使用curl_multi_exec()执行所有请求,通过轮询的方式直到所有请求完成。

  • curl_multi_select()可以减少CPU空转,提高效率。

  • 请求完成后,分别用curl_multi_getcontent()获取响应内容。

  • 最后,记得使用curl_multi_remove_handle()移除句柄,并用curl_multi_close()关闭multi handle以释放资源。

注意事项

  • 并发数量:如果一次性请求的URL太多,建议分批处理,比如每次只并发10个请求,避免占用过多资源。

  • 超时处理:可以设置CURLOPT_TIMEOUTCURLOPT_CONNECTTIMEOUT来避免某些请求长时间挂起。

  • 错误处理:使用curl_errno()curl_error()检查单个请求是否出错。

  • 连接重用:开启CURLOPT_FORBID_REUSE可以避免频繁创建TCP连接,提高性能。

总结

通过结合使用curl_execcurl_multi_close,我们可以在PHP中高效地处理大量HTTP并发请求。这种方式不仅可以缩短整体请求时间,还能充分利用服务器的并发能力,是构建高性能PHP应用的必备技能之一。

掌握这些基础,你就能让你的PHP应用跑得更快、更稳!