uma / hydra
Requires
- php: >=7.1
- ext-curl: *
- nyholm/psr7: ^1.1
- psr/http-message: ^1.0
This package is auto-updated.
Last update: 2024-09-18 05:28:23 UTC
README
Hydra是一个简单的基于cURL的并发HTTP客户端,它通过一个易于使用的PSR-7包装器进行抽象。
安装
通过Composer
composer require uma/hydra
快速演示
简而言之,您可以通过重复调用load
方法并传递PSR-7请求和将处理其响应的服务来调用。一旦加载了您想要一次性发送的所有请求,就调用sendAll
。当此方法运行时,它将按照接收响应的顺序调用每个处理器。在所有响应都接收并执行其处理器后,sendAll
会阻塞。
此外,客户端永远不会抛出异常(遇到的任何错误都会通知给相关的处理器,而不会中断执行流程)。
<?php
use Nyholm\Psr7\Request;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use UMA\Hydra;
require_once __DIR__ . '/vendor/autoload.php';
class DemoHandler implements Hydra\ResponseHandler {
public function handle(
RequestInterface $request,
?ResponseInterface $response,
Hydra\CurlStats $stats
): void
{
echo \sprintf(
"%b %s %s %s\n",
null === $response,
$stats->error_code,
$stats->total_time,
(string) $request->getUri()
);
}
}
$time = \microtime(true);
$client = new Hydra\Client();
$handler = new DemoHandler();
$client->load(new Request('GET', 'https://www.google.com/'), $handler);
$client->load(new Request('GET', 'https://packagist.org.cn/'), $handler);
$client->load(new Request('GET', 'https://invalid.doma.in/'), $handler);
$client->sendAll();
// 1 6 0.009291 https://invalid.doma.in/
// 0 0 0.162465 https://www.google.com/
// 0 0 0.26687 https://packagist.org.cn/
echo \sprintf("\nTotal elapsed time: %s\n", \microtime(true) - $time);
// Total elapsed time: 0.27728295326233
文档
客户端行为
Client
通过其load
方法接受可变数量的PSR-7请求,但不会立即发送它们。对于load
的第二个参数是处理响应的对象,它必须实现ResponseHandler
接口。ResponseHandler需要由库的最终用户实现,并且在不同的load
调用中可以重用相同的实例。
加载所有请求后,调用sendAll
将一次性发送所有请求,并按照接收响应的顺序运行它们的处理器。sendAll
本身是阻塞的(在所有请求被处理之前,执行将不会继续),并且不返回任何内容。Client
在任何情况下都不应该抛出异常,无论每个请求的结果如何。
ResponseHandler API
ResponseHandler
对象在其handle
方法中接收到3个参数,当Client
完成与其相关请求的处理时。
第一个参数是与load
一起提供的相同的PSR-7请求实例,这对于确定处理器正在处理哪个响应是有用的。
第二个参数是一个PSR-7响应对象。如果cURL未能完成HTTP请求或任何给定原因,它将是null。因此,建议在执行任何其他操作之前检查cURL错误代码$stats->error_code
。您绝对不应该从处理器中抛出异常,因为这将阻止其他处理器运行。
第三个参数,一个CurlStats
对象,是一个DTO,包含cURL关于请求的所有可用统计信息。
除了在这里记录的元素之外,CurlStats
还有一个error_code
属性,包含cURL错误代码,以及一些辅助函数,可以轻松地从原始统计信息中获取信息,例如远程服务器处理时间。
ClientOptions
Client
可以通过在构造时接受一个ClientOptions
实例来进一步自定义。
// Time amounts have to be specified in milliseconds.
$customOptions = (new ClientOptions)
->withDisabledDNSCaching()
->withCustomConnectionTimeout(100)
->withCustomResponseTimeout(100)
->withProxy('http://hoverfly.local:8500');
$customClient = new Client($customOptions);
常见问题解答和技巧
Hydra与Guzzle相比如何?
可以发送多少个并发请求?
为什么Hydra依赖于nyholm/psr7
包?
为什么Hydra不兼容PSR-18?
如何编写ResponseHandlers
测试
使用composer test
运行它们。它们需要docker和docker-compose。