workerman5.0篇〡异步非阻塞协程HTTP客户端
workerman5.0篇〡异步非阻塞协程HTTP客户端
概述workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞,内置连接池,消息请求和响应符合PSR7规范。Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端,它能够充分利用PHP的异步特性来提高HTTP请求的效率和性能。这个组件允许开发者在编写PH
workerman5.0篇〡异步非阻塞协程HTTP客户端
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.0
、workerman/http-client>=2.0.0
并安装composer require revolt/event-loop ^1.0.0
/var/www/webman/admin. # php start.php start
Workerman[start.php] start in DEBUG mode
------------------------------------------------------- WORKERMA --------------------------------------------------------
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 :8288 24 [OK]
revolt tcp root monitor none 1 [OK]
--------------------------------------------------------------------------------------------------------------------------
WorkerMan 中使用
代码语言:javascript代码运行次数:0运行复制declare(strict_types=1);
use Workerman\Worker;
require_once '../vendor/autoload.php';
try {
$worker = new Worker();
$worker->onWorkerStart = function () {
$http = new Workerman\Http\Client();
$respe = $http->get('/');
var_dump($respe->getStatusCode());
echo $respe->getBody() . PHP_EOL;
$respe = $http->post('/', ['key1' => 'value1', 'key2' => 'value2']);
var_dump($respe->getStatusCode());
echo $respe->getBody() . PHP_EOL;
$respe = $http->request('/', [
'method' => 'GET',
'version' => '1.1',
'headers' => ['Connection' => 'keep-alive'],
'data' => ['key1' => 'value1', 'key2' => 'value2'],
]);
echo $respe->getBody() . PHP_EOL;
};
Worker::runAll();
} catch (Throwable $throwable) {
var_dump($throwable->getMessage());
}
http-client 协程异步并发
代码语言:javascript代码运行次数:0运行复制<?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(":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;
$respe = $http->get('');
$endTime = microtime(true);
echo '结束时间:' . $endTime . PHP_EOL;
$result[] = sprintf('第%d个 | 耗时%s秒 | 状态码%d', $count, $endTime - $startTime, $respe->getStatusCode());
}
$connection->send(json_encode($result));
};
Worker::runAll();
webman 中使用
如果你需要在webman中使用异步http请求并将结果返回给前端,参考以下用法
代码语言:javascript代码运行次数:0运行复制<?php
declare(strict_types=1);
namespace app\controller;
use support\Request;
use support\Respe;
use Throwable;
use Workerman\Protocols\Http\C;
class CoroutineController
{
/**
* @param Request $request
* @return Respe
* @throws Throwable
*/
public function index(Request $request): Respe
{
$connection = $request->connection;
$http = new \Workerman\Http\Client();
$http->get('', function ($respe) use ($connection) {
$connection->send(new C($respe->getBody()->getContents()));
$connection->send(new C('')); // 发送空的的c代表respe结束
});
return respe()->withHeaders([
"Transfer-Encoding" => "ced",
"Access-Control-Allow-Origin" => "*"
]);
}
}
以上用法是先给客户端返回一个带ced
的http
头,然后将数据以c
的方式发送给客户端。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-22 12:05:58
推荐阅读
留言与评论(共有 11 条评论) |
本站网友 焦作电影院 | 4分钟前 发表 |
Request $request) { $http = new \Workerman\Http\Client(); $count = 50; $result = []; while ($count--) { $startTime = microtime(true); echo '开始时间:' . $startTime . PHP_EOL; $respe = $http->get(''); $endTime = microtime(true); echo '结束时间:' . $endTime . PHP_EOL; $result[] = sprintf('第%d个 | 耗时%s秒 | 状态码%d' | |
本站网友 wxwidgets | 12分钟前 发表 |
[ 'method' => 'GET' | |
本站网友 河北试管婴儿 | 6分钟前 发表 |
workerman/http-client>=2.0.0 并安装 composer require revolt/event-loop ^1.0.0启动webman代码语言:javascript代码运行次数:0运行复制/var/www/webman/admin. # php start.php start Workerman[start.php] start in DEBUG mode ------------------------------------------------------- WORKERMA -------------------------------------------------------- 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 | |
本站网友 空客310 | 6分钟前 发表 |
这意味着可以同时处理多个HTTP请求和响应 | |
本站网友 上海市皮肤科医院 | 13分钟前 发表 |
分享自 | |
本站网友 炸猪排 | 21分钟前 发表 |
$count | |
本站网友 云南白药胶囊成分 | 29分钟前 发表 |
参考以下用法代码语言:javascript代码运行次数:0运行复制<?php declare(strict_types=1); namespace app\controller; use support\Request; use support\Respe; use Throwable; use Workerman\Protocols\Http\C; class CoroutineController { /** * @param Request $request * @return Respe * @throws Throwable */ public function index(Request $request) | |
本站网友 香皂品牌 | 6分钟前 发表 |
该组件还支持WebSocket | |
本站网友 彭州租房 | 5分钟前 发表 |
这意味着可以同时处理多个HTTP请求和响应 | |
本站网友 淮扬镇铁路 | 7分钟前 发表 |
$endTime - $startTime |