react/http-client

此包已被废弃且不再维护。作者建议使用 react/http 包。

ReactPHP 的基于事件的流式 HTTP 客户端

v0.5.11 2021-04-07 16:49 UTC

README

此包已迁移至 react/http,仅存在为向后兼容原因。

$ composer require react/http

如果您之前使用过此包,升级可能需要片刻时间。新的 API 已更新为使用 Promises 和 PSR-7 消息抽象。这意味着它现在比以往任何时候都更强大且易于使用。

// old
$client = new React\HttpClient\Client($loop);
$request = $client->request('GET', 'https://example.com/');
$request->on('response', function ($response) {
    $response->on('data', function ($chunk) {
        echo $chunk;
    });
});
$request->end();

// new
$browser = new React\Http\Browser($loop);
$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
    echo $response->getBody();
});

有关更多详细信息,请参阅 react/http

以下文档适用于此包的最后一个版本。进一步的开发将在更新的 react/http 中进行,因此强烈建议您尽快升级。

已弃用的 HttpClient

Build Status

ReactPHP 的基于事件的流式 HTTP 客户端。

目录

基本用法

客户端

Client 负责与 HTTP 服务器通信,管理连接状态并发送您的 HTTP 请求。它还将所有内容注册到主要的 EventLoop

$loop = React\EventLoop\Factory::create();
$client = new Client($loop);

如果您需要自定义连接器设置(DNS 解析、TLS 参数、超时、代理服务器等),您可以显式传递一个自定义的 ConnectorInterface 实例。

$connector = new \React\Socket\Connector($loop, array(
    'dns' => '127.0.0.1',
    'tcp' => array(
        'bindto' => '192.168.10.1:0'
    ),
    'tls' => array(
        'verify_peer' => false,
        'verify_peer_name' => false
    )
));

$client = new Client($loop, $connector);

可以使用 request(string $method, string $uri, array $headers = array(), string $version = '1.0'): Request 方法准备新的 Request 对象。

可选的 $headers 参数可以用于传递额外的请求头。您可以使用关联数组(键=值)或数组(每个头值=键)来传递。如果适用,请求将自动包含适当的 HostUser-Agent: react/alphaConnection: close 头。您可以传递自定义头值或使用空数组来省略任何这些。

可以使用 Request#write(string $data) 方法将数据写入请求体。数据将被缓冲,直到底层连接建立,此时缓冲的数据将被发送,所有进一步的数据将立即传递到底层连接。

Request#end(?string $data = null) 方法可以用来完成请求的发送。您可以可选地传递一个最后的请求体数据块,就像 write() 调用一样发送。调用此方法将最终确定出站请求体(可能为空)。数据将被缓冲,直到底层连接建立,此时将发送缓冲数据,并忽略所有后续数据。

Request#close() 方法可以用来强制关闭请求的发送。与 end() 方法不同,此方法会丢弃任何缓冲区,并在连接已建立的情况下关闭底层连接,否则取消挂起的连接尝试。

请求实现了 WritableStreamInterface 接口,因此可以将流管道连接到它。请求发出的有趣事件

  • response:已从服务器接收到响应头,并成功解析。第一个参数是一个响应实例。
  • drain:出站缓冲区已清空,响应已准备好接受下一次 write() 调用的更多数据。
  • error:发生了错误,第一个参数是 Exception。如果响应发出 error 事件,此事件也会在这里发出。
  • close:请求已关闭。如果发生错误,此事件将先于 error 事件发出。对于成功的响应,只有在响应发出 close 事件后才会发出此事件。

响应实现了 ReadableStreamInterface 接口。响应发出的有趣事件

  • data:将响应体的数据块作为第一个参数传递。当响应遇到分块编码的响应时,它将自动解析它,并为用户移除 Transfer-Encoding 头部。
  • error:发生了错误,第一个参数是 Exception。这也会被转发到请求,并发出那里的 error 事件。
  • end:已完全接收到响应。
  • close:响应已关闭。如果发生错误,此事件将先于 error 事件发出。这也会被转发到请求,并发出那里的 close 事件。

示例

<?php

$loop = React\EventLoop\Factory::create();
$client = new React\HttpClient\Client($loop);

$request = $client->request('GET', 'https://github.com/');
$request->on('response', function ($response) {
    $response->on('data', function ($chunk) {
        echo $chunk;
    });
    $response->on('end', function() {
        echo 'DONE';
    });
});
$request->on('error', function (\Exception $e) {
    echo $e;
});
$request->end();
$loop->run();

请参阅 示例

高级用法

Unix 域套接字

默认情况下,此库支持通过明文 TCP/IP 和安全 TLS 连接在 http://https:// URI 方案中传输。此库还支持在明确配置的情况下使用 Unix 域套接字(UDS)。

为了使用 UDS 路径,您必须明确配置连接器以覆盖目标 URI,这样请求 URI 中给出的主机名将不再用于建立连接。

$connector = new FixedUriConnector(
    'unix:///var/run/docker.sock',
    new UnixConnector($loop)
);

$client = new Client($loop, $connector);

$request = $client->request('GET', 'http://localhost/info');

请参阅 示例 #11

安装

安装此库的推荐方法是 通过 Composer对 Composer 不熟悉?

这将安装最新支持的版本

$ composer require react/http-client:^0.5.10

请参阅 变更日志 了解有关版本升级的详细信息。

此项目旨在在所有平台上运行,因此不需要任何 PHP 扩展,并支持在旧版 PHP 5.3 到当前 PHP 7+ 和 HHVM 上运行。强烈建议为此项目使用 PHP 7+。

测试

要运行测试套件,首先需要克隆此仓库,然后通过Composer安装所有依赖项(请访问Composer网站)

$ composer install

要运行测试套件,请进入项目根目录并运行

$ php vendor/bin/phpunit

测试套件还包含一些功能集成测试,这些测试会向在线服务http://httpbin.org发送测试HTTP请求,因此依赖于稳定的互联网连接。如果您不想运行这些测试,可以像这样简单地跳过

$ php vendor/bin/phpunit --exclude-group internet

许可证

MIT许可证,请参阅LICENSE文件