首页/新闻资讯/正文详情

PHP使用Guzzle发起的异步请求示例详解

发布时间:2026/9/27 23:06:16 来源:云帆数科 栏目:资讯中心
PHP使用Guzzle发起的异步请求示例详解
Guzzle中的异步请求使用Guzzle发起异步请求Guzzle是一个PHP的HTTP客户端它在发起http请求时不仅可以同步发起还可以异步发起。12345678$clientnewClient();$requestnewRequest(GET,http://www.baidu.com);$promise$client-sendAsync($request)-then(function($response) {echo$response-getBody();});// todo somethingecho1;$promise-wait();PHP发起HTTP请求的几种方式curl使用libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。stream通过流的方式获取和发送远程文件该功能需要ini配置allow_url_fopenon。关于php的流更多参考PHP流Stream的概述与使用详解在guzzle中可以兼容使用这两种的任意一种或者是用户自定义的http handler1234567891011121314151617181920functionchoose_handler(){$handler null;if(function_exists(curl_multi_exec) function_exists(curl_exec)) {$handler Proxy::wrapSync(newCurlMultiHandler(),newCurlHandler());}elseif(function_exists(curl_exec)) {$handlernewCurlHandler();}elseif(function_exists(curl_multi_exec)) {$handlernewCurlMultiHandler();}if(ini_get(allow_url_fopen)) {$handler$handler? Proxy::wrapStreaming($handler,newStreamHandler()):newStreamHandler();}elseif(!$handler) {thrownew\RuntimeException(GuzzleHttp requires cURL, the .allow_url_fopen ini setting, or a custom HTTP handler.);}return$handler;}可以看出guzzle会优先使用curl然后选择使用streamProxy::wrapStreaming($handler, new StreamHandler())是一个流包装器。12345678910publicstaticfunction wrapStreaming(callable $default,callable $streaming) {returnfunction (RequestInterface $request, array $options) use ($default, $streaming) {returnempty($options[stream])? $default($request, $options): $streaming($request, $options);};}什么是URIURI的组成URIUniform Resource Identifier统一资源标识符。scheme:[//[user:password]host[:port]][/]path[?query][#fragment]请求的组装Guzzle发起请求大致分为两个阶段第一阶段负责将需要请求的uri组装成各种内部定义的类。Client类这是一个发起客户端的调用者后续所有的调用需要基于这个负责的类实现它负责提供一个 handler ,这是一个客户端发起http请求的句柄其中Guzzle实现curl和stream调用的无感知就是在这里实现的同时开发者也可以自定义请求协议。123456789101112131415161718192021// 根据系统当前状态选择一个发起Http请求的协议的方法句柄functionchoose_handler(){$handler null;if(function_exists(curl_multi_exec) function_exists(curl_exec)) {$handler Proxy::wrapSync(newCurlMultiHandler(),newCurlHandler());}elseif(function_exists(curl_exec)) {$handlernewCurlHandler();}elseif(function_exists(curl_multi_exec)) {$handlernewCurlMultiHandler();}if(ini_get(allow_url_fopen)) {$handler$handler? Proxy::wrapStreaming($handler,newStreamHandler()):newStreamHandler();}elseif(!$handler) {thrownew\RuntimeException(GuzzleHttp requires cURL, the .allow_url_fopen ini setting, or a custom HTTP handler.);}return$handler;}Request类负责定义一个uriPromise类这个类负责承载类请求发起前的各种准备工作完成后的结果还包括两个回调请求成功回调、请求失败回调,同时请求发起中的队列延迟等处理也是在这个类里。其中组装阶段最重要的方法是私有方法private function transfer(RequestInterface $request, array $options)它负责将用户通过各种方法传入的uri和client类的各种属性组合然后使用这些属性生成一个新的类 Promise 类。请求的发起Client的各种属性组装完成后就可以使用得到的Promise类发起http请求了这里主要是通过一个 wait() 方法。同步调用与异步调用在同步方法内部的调用同步方法是在内部组装好一个Promise之后立刻发起wait()调用。12345publicfunction send(RequestInterface $request, array $options []){$options[RequestOptions::SYNCHRONOUS] true;return$this-gt;sendAsync($request, $options)-gt;wait();}wait的实现wait() 方法的实现逻辑也很简单递归调用wait()方法直到result属性不是PromiseInterface实现类或者state不是pending然后将结果逐层输出。这里说一下这个state的pending状态这是一个PromiseInterface实现类的初始化状态表示改实现类还没有完成需要继续wait。1234567891011121314151617publicfunction wait($unwrap true){$this-gt;waitIfPending();$inner $this-gt;result instanceof PromiseInterface? $this-gt;result-gt;wait($unwrap): $this-gt;result;if($unwrap) {if($this-gt;result instanceof PromiseInterface|| $this-gt;state self::FULFILLED) {return$inner;}else{// Its rejected so unwrap and throw an exception.throwexception_for($inner);}}}waitIfPending() 如果promise类还处于pending状态就执行。主要是执行改实现类的waitFn方法。最外层promise执行完成后执行queue()-run() 这个方法内部循环执行队列内方法直到队列为空。至此Guzzle就能将组装进来的多个request和各种方法执行完毕。123456789101112131415161718192021222324252627privatefunctionwaitIfPending(){if($this-state ! self::PENDING) {return;}elseif($this-waitFn) {$this-invokeWaitFn();}elseif($this-waitList) {$this-invokeWaitList();}else{// If theres not wait function, then reject the promise.$this-reject(Cannot wait on a promise that has .no internal wait function. You must provide a wait .function when constructing the promise to be able to .wait on a promise.);}queue()-run();if($this-state self::PENDING) {$this-reject(Invoking the wait callback did not resolve the promise);}}publicfunctionrun(){/** var callable $task */while($taskarray_shift($this-queue)) {$task();}}waitFn是什么回到前面提到的transfer()函数。123$handler$options[handler];// 返回一个promise类这个类有一个属性是waitFnreturnPromise\promise_for($handler($request,$options));这里我们看 $handler 是什么它是一个HandleStack类就是我们在new Client时选择的发起Http请求的协议的方法句柄实例化的类。br /之后的调用依次是 HandleStack-__invoke、RedirectMiddleware-__invoke、PrepareBodyMiddleware-__invoke。执行$fn($request, $options);方法经过前面的逐层处理此时的$fn就是HandleStack内部的Proxy包装的方法无论使用哪种协议都会在各自的实现里实例化一个拥有waitFn的Promise的实例。1234567// curl的实现$promisenewPromise([$this,execute],function()use($id) {return$this-cancel($id);});复制讲解由此可以直到waitFn方法就是各自协议的实现类的请求发起方法。then() 方法会将promise本身再封装一层promise并将原先的waitFn和then()的回调方法打包进waitFnList属性里。queue() 是的入队时机当请求执行完成后依次调用 processMessages()、promise-resolve()、settle()、FulfilledPromise-then()将请求结果插入队列。1234567891011$queue-add(staticfunction()use($p,$value,$onFulfilled) {if($p-getState() self::PENDING) {try{$p-resolve($onFulfilled($value));}catch(\Throwable$e) {$p-reject($e);}catch(\Exception$e) {$p-reject($e);}}});以上就是PHP使用Guzzle发起的异步请求示例详解的详细内容

相关推荐

二级域名分发系统源码:自动化申请解析与易支付对接实战
二级域名分发系统源码:自动化申请解析与易支付对接实战

简介:这份资源是PHP开发的二级域名分发系统源码,已对接易支付接口,面向需要搭建域名分发平台的站长、个人开发者及中小型服务商,可解决多用户二级域名申请、自动分发与在线收款的一体化需求。源码基于PHP7.2环境运行,需… · 2026/9/27 23:06:16

Python Tornado项目管理系统源码实战:环境搭建、核心模块与避坑指南
Python Tornado项目管理系统源码实战:环境搭建、核心模块与避坑指南

简介:这份资源是基于Python的Tornado框架实现的项目管理系统完整源码,面向具备一定Python基础、希望学习Web后端开发与项目实战的开发者,尤其适合想通过真实项目理解Tornado异步框架、路由分发与前后端协作的进阶学习者。压缩包共92个文件&am… · 2026/9/27 23:06:16

基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化
基于睿擎工业开发平台的预训练视觉模型轻量化适配与低代码部署优化

工业边缘视觉AI的落地,不仅需要高实时、高可靠的运行底座,还需要覆盖数据采集、样本标注、模型适配、量化转换、部署推理和性能评估的完整工具链。睿擎工业开发平台基于RT-Thread硬实时内核与Linux混合部署架构,原生集成NCNN推理框架并支持YO… · 2026/9/27 23:06:10

wordpress浏览数插件选型:避开3大坑的免费工具实战指南
wordpress浏览数插件选型:避开3大坑的免费工具实战指南

wordpress浏览数插件选型:避开3大坑的免费工具实战指南 域名服务器搞不懂?别急,这往往是新手装插件报错的根源。很多站长盯着后台的“内部错误”,却忽略了底层环境的配置。其实,wordpress浏览数插件这类免费工具,只要选对方向,根本… · 2026/9/27 23:41:17

Superpowers实战指南:给Claude Code装上可执行的工程流程
Superpowers实战指南:给Claude Code装上可执行的工程流程

1. 先弄清楚Superpowers解决了什么:我给Claude Code装了又卸、卸了又装的原因1.1 为什么“会聊天的AI”和“会干活的AI”之间差着一整套流程先说我自己的经历。第一次听说Superpowers这个项目时,我下意识以为它又是一个“提示词收藏夹”——把几十条精心… · 2026/9/27 23:41:17

Batchplot_3.6.1批量打印插件:CAD图纸批量出图效率提升与避坑指南
Batchplot_3.6.1批量打印插件:CAD图纸批量出图效率提升与避坑指南

1. 为什么我最终选择了Batchplot_3.6.1这个版本做工程制图这行的朋友应该都有体会,图纸画完只是第一步,真正折磨人的是出图。一个中型项目几十上百张CAD图纸,一张张打开、设置打印参数、选打印机、点确定,机械重复到让人怀疑人生。… · 2026/9/27 23:41:17

Penrose 交互性详解:Edit Mode 与 Play Mode 的完整指南
Penrose 交互性详解:Edit Mode 与 Play Mode 的完整指南

开发工具数据可视化 【免费下载链接】penrose Create beautiful diagrams just by typing notation in plain text. 项目地址: https://gitcode.com/gh_mirrors/pe/penrose 点击查看 免费下载 本指南聚焦 Penrose 编辑器(位于 packages/editor&#xff… · 2026/9/27 23:41:11

凡科董事长背景揭秘:建站避坑指南与成本真相
凡科董事长背景揭秘:建站避坑指南与成本真相

凡科董事长背景揭秘:建站避坑指南与成本真相 找建站公司最怕什么?怕被坑高价,更怕花大钱买了个“半成品”。很多老板在搜索【凡科董事长】时,其实是在找一种安全感,想通过了解大厂背景来确认这家平台靠不靠谱。但这篇【避坑指南】不会只跟你聊高管八卦,… · 2026/9/27 23:41:04

NodeMCU Firmware 上的 IMAP 邮件客户端:基于 imap.lua 的 ESP8266 邮件读取实战指南
NodeMCU Firmware 上的 IMAP 邮件客户端:基于 imap.lua 的 ESP8266 邮件读取实战指南

物联网嵌入式 【免费下载链接】nodemcu-firmware Lua based interactive firmware for ESP8266, ESP8285 and ESP32 项目地址: https://gitcode.com/gh_mirrors/no/nodemcu-firmware 点击查看 免费下载 导读 imap.lua 是 NodeMCU Firmware 仓库中一个以纯 Lua 实现… · 2026/9/27 23:40:52

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码