reactphp-x / guzzle-http
dev-master
2025-06-24 11:20 UTC
Requires
- guzzlehttp/guzzle: ^7.9
- react/http: ^1.11
This package is not auto-updated.
Last update: 2025-06-25 09:53:24 UTC
README
一个将 ReactPHP 的异步 HTTP 客户端与 Guzzle HTTP 客户端库集成的适配器。这个项目允许你在 ReactPHP 环境中使用熟悉的 Guzzle API,同时享受 ReactPHP 的非阻塞 I/O 性能优势。
特性
- 🚀 异步性能: 基于 ReactPHP 的非阻塞 I/O
- 🔧 熟悉 API: 使用标准的 Guzzle HTTP 客户端接口
- ⚡ 并发支持: 轻松处理多个并发 HTTP 请求
- 🛡️ 错误处理: 完整的 Promise 错误处理机制
- 🔄 事件循环集成: 自动管理 ReactPHP 事件循环和 Guzzle Promise 队列
- ⚙️ 选项适配: 支持大部分 Guzzle 选项(超时、认证、代理等)
安装
使用 Composer 安装:
composer require reactphp-x/guzzle-http
快速开始
<?php require_once 'vendor/autoload.php'; use ReactphpX\GuzzleHttp\HttpClientAdapter; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; // 创建适配器 $adapter = new HttpClientAdapter(); // 创建 Guzzle 客户端 $stack = HandlerStack::create($adapter); $client = new Client(['handler' => $stack]); // 发送异步请求 $promise = $client->getAsync('https://api.example.com/data'); $promise->then( function ($response) { echo "请求成功: " . $response->getStatusCode(); }, function ($exception) { echo "请求失败: " . $exception->getMessage(); } );
核心组件
HttpClientAdapter
HttpClientAdapter
是连接 ReactPHP 和 Guzzle 的桥梁。它实现了 Guzzle 的处理器接口,但使用 ReactPHP 的异步 HTTP 客户端来执行请求。
use ReactphpX\GuzzleHttp\HttpClientAdapter; // 基本用法 $adapter = new HttpClientAdapter(); // 带默认选项 $defaultOptions = [ 'timeout' => 30, 'headers' => ['User-Agent' => 'MyApp/1.0'] ]; $adapter = new HttpClientAdapter(null, $defaultOptions);
Poll 类
Poll
类负责管理 ReactPHP 事件循环和 Guzzle Promise 队列之间的协调,确保异步操作能够正确执行。
use ReactphpX\GuzzleHttp\Poll; use React\EventLoop\Loop; $poll = new Poll(Loop::get());
使用示例
基本 GET 请求
<?php use ReactphpX\GuzzleHttp\HttpClientAdapter; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; $adapter = new HttpClientAdapter(); $stack = HandlerStack::create($adapter); $client = new Client(['handler' => $stack]); $promise = $client->getAsync('https://httpbin.org/get'); $promise->then( function ($response) { echo "状态码: " . $response->getStatusCode() . "\n"; echo "内容: " . $response->getBody()->getContents() . "\n"; } );
带选项的请求
<?php // 带超时和自定义头部 $promise = $client->getAsync('https://httpbin.org/delay/2', [ 'timeout' => 5, 'headers' => [ 'X-Custom-Header' => 'test-value' ] ]); // 带查询参数 $promise = $client->getAsync('https://httpbin.org/get', [ 'query' => [ 'param1' => 'value1', 'param2' => 'value2' ] ]); // 基本认证 $promise = $client->getAsync('https://httpbin.org/basic-auth/user/passwd', [ 'auth' => ['user', 'passwd'] ]);
并发请求
<?php use GuzzleHttp\Promise\Utils; $urls = [ 'https://httpbin.org/get', 'https://httpbin.org/status/200', 'https://httpbin.org/delay/1' ]; $promises = []; foreach ($urls as $url) { $promises[] = $client->getAsync($url); } Utils::settle($promises)->then(function ($results) { foreach ($results as $result) { if ($result['state'] === 'fulfilled') { echo "成功: " . $result['value']->getStatusCode() . "\n"; } else { echo "失败: " . $result['reason']->getMessage() . "\n"; } } });
POST 请求
<?php $data = ['name' => 'ReactPHP x Guzzle', 'version' => '1.0.0']; $promise = $client->postAsync('https://httpbin.org/post', [ 'json' => $data, 'headers' => [ 'User-Agent' => 'ReactPHP-x-Guzzle/1.0.0' ] ]); $promise->then(function ($response) { $body = json_decode($response->getBody()->getContents(), true); echo "服务器收到的数据: " . print_r($body['json'], true); });
支持的选项
适配器支持以下 Guzzle 选项:
请求选项
headers
: 自定义请求头query
: 查询参数auth
: 基本认证 (用户名/密码)timeout
: 请求超时时间connect_timeout
: 连接超时时间
连接选项
verify
: SSL 验证设置 (true/false/证书路径)proxy
: 代理设置
响应选项
http_errors
: HTTP 错误处理 (默认 true)allow_redirects
: 重定向处理 (默认 true)
更多示例
查看 examples/
目录获取更多使用示例:
simple_request.php
- 基本 GET 请求multiple_requests.php
- 并发请求处理post_request.php
- POST 请求示例advanced_options.php
- 高级选项适配示例
运行示例:
php examples/simple_request.php php examples/multiple_requests.php php examples/post_request.php php examples/advanced_options.php
API 参考
HttpClientAdapter
构造函数
public function __construct(?Poll $poll = null, array $defaultOptions = [])
$poll
: 可选的 Poll 实例,如果不提供将自动创建$defaultOptions
: 默认选项数组
调用方法
public function __invoke(RequestInterface $request, array $options): Promise
$request
: PSR-7 请求对象$options
: 请求选项数组- 返回: Guzzle Promise 对象
Poll
构造函数
public function __construct(LoopInterface $loop)
$loop
: ReactPHP 事件循环实例
方法
public function activate(): void
激活轮询,开始处理 Guzzle Promise 队列。
public function deactivate(): void
停用轮询,停止处理 Guzzle Promise 队列。
依赖
- PHP >= 7.4
- ReactPHP HTTP >= 1.11
- Guzzle HTTP >= 7.9
许可证
MIT License
贡献
欢迎提交 Issue 和 Pull Request!
作者
- wpjscc (wpjscc@gmail.com)