reactphp-x/guzzle-http

dev-master 2025-06-24 11:20 UTC

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!

作者