news 2026/6/10 19:08:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 环境下,队列是安全且可扩展的解法
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:53:28

基于Hive的淘宝彩妆销售数据的设计与实现选题审批表

河北东方学院本科毕业论文(设计)选题审批表学院(宋体5号居中)班级与教务系统专业一致姓名(宋体5号居中)学号(宋体5号居中)指导教师姓名(宋体5号居中)指导教师职称(填写具…

作者头像 李华
网站建设 2026/6/9 22:04:14

触控异常频发?Open-AutoGLM系统响应问题排查全解析,速查手册曝光

第一章:Open-AutoGLM触控无响应问题概述在部署 Open-AutoGLM 框架的智能交互终端设备中,部分用户反馈出现了触控屏无响应的现象。该问题主要表现为:系统正常启动,界面可正常渲染,但用户触摸操作无法被识别或仅局部区域…

作者头像 李华
网站建设 2026/6/7 16:10:29

Redis 零基础到进阶,Redis 集群,笔记 74-92

Redis 零基础到进阶,Redis 集群,笔记 74-92 参考资料 【尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练(附redis面试题)】 https://www.bilibili.com/video/BV13R4y1v7sP/?p74&share_sourcecop…

作者头像 李华
网站建设 2026/6/10 11:25:13

揭秘Open-AutoGLM长按失效之谜:5个你必须掌握的排查技巧

第一章:揭秘Open-AutoGLM长按失效之谜:问题的本质与影响在现代自动化测试框架中,Open-AutoGLM 因其强大的手势识别能力被广泛应用于移动端 UI 测试。然而,近期多个开发者反馈其“长按”操作频繁失效,严重影响了用例的稳…

作者头像 李华
网站建设 2026/6/10 13:36:41

揭秘Open-AutoGLM特殊符号输入失败:99%开发者忽略的底层机制

第一章:揭秘Open-AutoGLM特殊符号输入失败:99%开发者忽略的底层机制在使用 Open-AutoGLM 进行自然语言处理任务时,许多开发者频繁遭遇特殊符号(如 , #, $, {}, &)输入后模型输出异常或直接崩溃的问题。这一现象并非…

作者头像 李华
网站建设 2026/6/10 15:33:49

【Open-AutoGLM符号输入故障突破】:20年专家亲授3步修复法

第一章:Open-AutoGLM符号输入故障概述在使用 Open-AutoGLM 框架进行自然语言处理任务时,符号输入故障是影响模型推理准确性的常见问题。该故障通常表现为特殊字符、数学符号或非标准 Unicode 字符未能被正确解析,导致模型输出异常或中断执行流…

作者头像 李华