使用 curl_multi_init 可并发执行多个 cURL 请求,提升效率。步骤包括:初始化单个 cURL 句柄并设置参数,创建多句柄,添加单个句柄至多句柄,执行并发请求并轮询状态,获取结果,关闭资源。示例中同时请求两个 API,合并 JSON 数据。关键点:curl_multi_exec 需循环调用,配合 curl_multi_select 避免 CPU 空转;用 curl_multi_getcontent 获取响应;及时释放资源防泄漏;可捕获错误信息;建议封装函数或类以支持动态配置;高阶场景可用 Swoole 或 ReactPHP。纯 PHP + curl_multi 适合轻量级并发需求。

PHP 中处理异步 cURL 请求主要依赖 curl_multi_init 相关函数,它允许你并发执行多个 cURL 请求,而不是逐个等待。这对于需要同时请求多个 API 或远程资源的场景非常有用,比如聚合数据、批量检测状态等。
使用 curl_multi_init 发起并发请求
curl_multi_init 可以创建一个多句柄,然后将多个 cURL 句柄(每个对应一个请求)加入其中,并通过循环等待所有请求完成。相比串行执行,这种方式显著提升效率。
基本步骤如下:
初始化多个单个 cURL 句柄(curl_init) 设置各个请求的参数(URL、超时、头部等) 创建多句柄(curl_multi_init) 将单个句柄加入多句柄(curl_multi_add_handle) 执行并发请求(curl_multi_exec)并轮询状态 获取结果并合并数据 关闭句柄释放资源
示例代码:并发请求并合并结果
以下是一个实用示例,同时请求两个 API 并合并返回的 JSON 数据:
立即学习“PHP免费学习笔记(深入)”;
$urls = [ 'https://jsonplaceholder.typicode.com/posts/1', 'https://jsonplaceholder.typicode.com/posts/2'];// 初始化多句柄$multi = curl_multi_init();$handles = [];// 创建并配置每个 cURL 句柄foreach ($urls as $i => $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 加入多句柄 curl_multi_add_handle($multi, $ch); $handles[$i] = $ch;}// 执行并发请求$running = 0;do { curl_multi_exec($multi, $running); curl_multi_select($multi); // 阻塞等待活动连接} while ($running > 0);// 收集结果$results = [];foreach ($handles as $i => $ch) { $response = curl_multi_getcontent($ch); $results[$i] = json_decode($response, true); curl_multi_remove_handle($multi, $ch); curl_close($ch);}// 关闭多句柄curl_multi_close($multi);// 合并结果$merged = array_merge(...array_values($results));print_r($merged);
关键点说明
curl_multi_exec 是非阻塞的,所以需要用循环不断调用直到所有请求完成。搭配 curl_multi_select 可以避免 CPU 空转。
curl_multi_getcontent 用于从句柄中提取响应体,必须在请求完成后调用。
注意及时调用 curl_multi_remove_handle 和 curl_close,防止资源泄漏。
如果某个请求失败(如超时或 DNS 错误),可以通过 curl_error 或 curl_errno 捕获具体信息。
实际应用建议
在高并发场景下,可以封装成函数或类,支持动态传入 URL 列表、自定义选项、超时控制和错误处理策略。
对于更复杂的异步需求(如回调、协程),可考虑使用 Swoole 或 ReactPHP,但纯 PHP + curl_multi 已能满足大多数轻量级并发请求场景。
基本上就这些。掌握 curl_multi 就能在不依赖扩展的情况下实现高效的并发 HTTP 请求处理。
以上就是php如何处理异步curl请求_phpcurl_multi_init并发请求与结果合并的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1338751.html
微信扫一扫
支付宝扫一扫