workerman5.0篇〡异步非阻塞协程HTTP客户端

embedded/2025/1/13 5:38:19/

概述

workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞,内置连接池,消息请求和响应符合PSR7规范。

Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端,它能够充分利用PHP的异步特性来提高HTTP请求的效率和性能。这个组件允许开发者在编写PHP代码时,以同步的方式发送异步HTTP请求,从而使得编写的代码更加简洁易懂,同时也能够处理大量的并发请求。

特点

  • 异步非阻塞:所有的请求和响应都是异步进行的,不会阻塞主线程,这意味着可以同时处理多个HTTP请求和响应。

  • 内置连接池:为了提高效率和性能,该组件内置了连接池,可以复用TCP连接,减少建立和关闭连接的开销。

  • 符合PSR-7规范:消息请求和响应都符合PSR-7规范,这使得它能够与遵循该规范的其他PHP组件和库无缝集成。

  • 支持多种协议:除了HTTP和HTTPS协议,该组件还支持WebSocket、WSS等协议,使其能够应对更多的应用场景。

安装

composer require workerman/http-client
开源技术小栈

注意:协程用法需要workerman>=5.0workerman/http-client>=2.0.0 并安装 composer require revolt/event-loop ^1.0.0

启动webman

/var/www/webman/admin.webman.tinywan.com # php start.php start
Workerman[start.php] start in DEBUG mode
------------------------------------------------------- WORKERMAN --------------------------------------------------------
Workerman/5.0.0         PHP/8.2.10 (Jit off)          Linux/5.15.167.4-microsoft-standard-WSL2
-------------------------------------------------------- WORKERS ---------------------------------------------------------
event-loop  proto       user        worker                       listen                      count       state
revolt      tcp         root        webman                       http://0.0.0.0:8288         24           [OK]
revolt      tcp         root        monitor                      none                        1            [OK]
--------------------------------------------------------------------------------------------------------------------------

协程用法

WorkerMan 中使用

declare(strict_types=1);
use Workerman\Worker;require_once '../vendor/autoload.php';try {$worker = new Worker();$worker->onWorkerStart = function () {$http = new Workerman\Http\Client();$response = $http->get('https://www.tinywan.com/');var_dump($response->getStatusCode());echo $response->getBody() . PHP_EOL;$response = $http->post('https://www.tinywan.com/', ['key1' => 'value1', 'key2' => 'value2']);var_dump($response->getStatusCode());echo $response->getBody() . PHP_EOL;$response = $http->request('https://www.tinywan.com/', ['method' => 'GET','version' => '1.1','headers' => ['Connection' => 'keep-alive'],'data' => ['key1' => 'value1', 'key2' => 'value2'],]);echo $response->getBody() . PHP_EOL;};Worker::runAll();
} catch (Throwable $throwable) {var_dump($throwable->getMessage());
}

http-client 协程异步并发

<?php
/*** @desc 伪代码* @author Tinywan(ShaoBo Wan)*/
declare(strict_types=1);use Workerman\Worker;
use \Workerman\Connection\TcpConnection;
use \Workerman\Protocols\Http\Request;require_once '../vendor/autoload.php';// 创建一个Worker监听8217端口,使用http协议通讯
$httpWorker = new Worker("http://0.0.0.0:8217");// 启动8个进程对外提供服务
$httpWorker->count = 8;// 接收到浏览器发送的数据时回复给浏览器
$httpWorker->onMessage = function (TcpConnection $connection, Request $request) {$http = new \Workerman\Http\Client();$count = 50;$result = [];while ($count--) {$startTime = microtime(true);echo '开始时间:' . $startTime . PHP_EOL;$response = $http->get('https://api.tinywan.com/systems/website');$endTime = microtime(true);echo '结束时间:' . $endTime . PHP_EOL;$result[] = sprintf('第%d个 | 耗时%s秒 | 状态码%d', $count, $endTime - $startTime, $response->getStatusCode());}$connection->send(json_encode($result));
};Worker::runAll();

webman 中使用

如果你需要在webman中使用异步http请求并将结果返回给前端,参考以下用法

<?php
declare(strict_types=1);namespace app\controller;use support\Request;
use support\Response;
use Throwable;
use Workerman\Protocols\Http\Chunk;class CoroutineController
{/*** @param Request $request* @return Response* @throws Throwable*/public function index(Request $request): Response{$connection = $request->connection;$http = new \Workerman\Http\Client();$http->get('https://api.tinywan.com/website', function ($response) use ($connection) {$connection->send(new Chunk($response->getBody()->getContents()));$connection->send(new Chunk('')); // 发送空的的chunk代表response结束});return response()->withHeaders(["Transfer-Encoding" => "chunked","Access-Control-Allow-Origin" => "*"]);}
}

以上用法是先给客户端返回一个带chunkedhttp头,然后将数据以chunk的方式发送给客户端。


http://www.ppmy.cn/embedded/153468.html

相关文章

uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥

从下方的偏旁部首中选在1--3个组成上面文章中的文字&#xff0c;完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…

GraphQL:强大的API查询语言

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTTP/HTTPS ④-对称加密 || 非对称加密

这里是Themberfue ✨HTTP协议的大体内容我们已经讲完了 ❤️本章我们将聊聊HTTPS中的 S 那些事儿 HTTPS简介 ✨在前三篇文章中&#xff0c;我们主要讲解了HTTP协议的简单介绍以及其报文的键值对含义等。比较于HTTP&#xff0c;HTTPS有什么不同呢&#xff1f;它们两者又有什么…

上手体验微软全新整合的王炸平台Fabric

体验确实不错&#xff0c;微软强大的生态能力。 把可视化&#xff0c;数仓&#xff0c;数据胡&#xff0c;数据工厂&#xff0c;机器学习&#xff0c;数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心&#xff0c;消除数据孤岛问题。而且不同角色可…

arcgis中用python脚本批量给多个要素类的相同字段赋值

1、python脚本 import arcpy# 设置工作空间路径 arcpy.env.workspace = r"D:\test.gdb"# 要素集名称 feature_dataset = "test"# 线要素类名称列表,初始化为空 line_feature_classes = []# 遍历要素集获取所有线要素类 for fc in arcpy.ListFeatureClass…

智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之25 祖传代码:垂类划分出负责监管控的“三层结构”

本文要点 要点 祖传代码将项目垂类划分为“三层结构” 分别负责&#xff1a; 前端组件的管理&#xff0c;后端组关的监视以及 中端组合的控制&#xff0c; -- 将http SPI &#xff08;标签类&#xff1a;a/p/div。 &#xff09;紧致&#xff08;收敛 &#xff09;为 一个目标…

jenkins 调用bat脚本

1&#xff0c;pipeline语句如下 bat cd /d "D:/WorkSpace"call TEST.bat2&#xff0c;带参数的bat 脚本bat脚本内容如下 echo offecho param[0] %0 echo param[1] %1 echo param[2] %2 echo param[3] %3 echo param[4] %4 echo param[5] %5 echo ... pause 运…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…