当前位置: 首页 > news >正文

Laravel 中 Http::get() 默认同步,切勿在循环中直接使用!

Http::get()(即Illuminate\Http\Client\Factory提供的 HTTP 客户端)默认是同步阻塞的,基于 Guzzle + cURL 或 stream wrapper 实现。在循环中直接调用会导致:

  • 串行请求:每个请求必须等前一个完成才发起下一个
  • 总耗时 ≈ ∑(各请求耗时),极易成为性能瓶颈
  • 浪费 CPU 资源:PHP 进程在 I/O 等待期间无法做其他工作

示例(反面教材)

$urls=['https://a.com','https://b.com','https://c.com'];foreach($urlsas$url){$response=Http::get($url);// 阻塞!// 处理响应}

若每个请求耗时 200ms,3 次请求总耗时 ≈ 600ms。


正确做法

✅ 方案 1:使用批量接口(首选)

如果目标服务支持批量查询(如 GraphQL、/batch endpoint),1 次请求解决 N 个问题

✅ 方案 2:改用异步协程(Swoole / ReactPHP)

在 Swoole 环境中,可用协程并发:

useSwoole\Coroutine;useSwoole\Coroutine\Http\Client;Coroutine\run(function()use($urls){$results=[];foreach($urlsas$url){go(function()use($url,&$results){$parsed=parse_url($url);$cli=newClient($parsed['host'],443,true);$cli->get($parsed['path']??'/');$results[$url]=$cli->body;$cli->close();});}// 所有请求并发执行,总耗时 ≈ 最慢单次请求});

注意:Laravel HTTP Client 本身不支持异步,需绕过它直接使用协程 HTTP 客户端。

✅ 方案 3:分片 + 队列(FPM 环境)

在传统 FPM 下,将任务分片交由队列处理:

// 控制器中URLBatchJob::dispatch($urls);// 队列任务中(可并行多个 worker)publicfunctionhandle(){foreach(array_chunk($this->urls,10)as$chunk){// 可在此 chunk 内用多进程或限制并发的同步请求}}
✅ 方案 4:用 Guzzle 的异步(仅限 CLI,且仍非真异步)

Guzzle 支持异步 promises,但 PHP 本身单线程,需手动wait()仍阻塞,仅能稍作优化:

$client=new\GuzzleHttp\Client();$promises=[];foreach($urlsas$url){$promises[$url]=$client->getAsync($url);}$responses=\GuzzleHttp\Promise\unwrap($promises);// 此处才发起并发

仅在 CLI 下有效,FPM 中仍可能超时;且无法与 LaravelHttp客户端直接集成。


总结

  • Http::get()是同步阻塞的,禁止在循环中直接使用
  • 优先考虑批量 API
  • 若需并发,必须脱离 Laravel HTTP Client,使用 Swoole 协程或队列分片。
  • 在 FPM 环境下,队列是安全且可扩展的解法
http://www.cnnetsun.cn/news/177975.html

相关文章:

  • LangFlow能否实现多轮对话流程?Chatbot构建实操
  • LangFlow中的Prompt模板管理技巧:提高复用率
  • 无需编程基础也能玩转大模型?LangFlow初学者完整指南
  • Open-AutoGLM手势响应失败?90%开发者都踩过的坑(附实测修复代码)
  • 揭秘Open-AutoGLM触控失灵难题:3步快速定位并解决响应故障
  • LangFlow中的文本预处理节点怎么用?清洗与标准化操作
  • 2014-2024年数字贸易限制指数:基础设施、电子交易数据
  • LangFlow构建人群细分标签工厂
  • 基于Java的国家教育智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 研究生必备:9款免费AI论文工具,查重率低于11%超靠谱!
  • 为什么 isset($array[‘key‘]) 比 array_key_exists() 快?它们在处理 null 值时行为有何不同?
  • PHP函数调用开销的庖丁解牛
  • LangFlow打造冷链物流温控报警系统
  • 基于Java+SSM+Flask校园活动资讯网系统(源码+LW+调试文档+讲解等)/校园活动/资讯网/系统/校园资讯/活动系统/校园网站/活动资讯/校园信息/资讯系统/校园平台
  • 基于深度学习的车牌识别系统任务书
  • 基于深度学习的家居垃圾分类系统的设计与实现开题报告
  • 基于深度学习的景点客流量分析系统的设计与实现开题报告
  • LangFlow构建话题热度趋势预警机制
  • LangFlow构建学术不端行为检测流程
  • LangFlow构建动态调价建议引擎
  • 迈向智能时代:软件测试管理的创新路径与实战策略
  • LangFlow构建海外市场进入策略模拟器
  • LangFlow实现网络安全事件响应流程
  • LangFlow构建IT服务请求智能分派器
  • C语言单链表核心操作全解析:初始化、销毁与常用接口实现
  • LangFlow实现点击流数据实时处理流程
  • 基于日志分析的计算机系统故障排查工具的设计与实现选题表
  • LangFlow创建版权侵权风险预警平台
  • PAT 1091 Acute Stroke
  • LangFlow结合向量数据库构建RAG系统的完整路径