uma/hydra

基于多cURL处理器的批量HTTP客户端

维护者

详细信息

gitlab.com/1ma/hydra

源代码

问题

dev-master 2022-01-17 23:42 UTC

This package is auto-updated.

Last update: 2024-09-18 05:28:23 UTC


README

Build Status Code Coverage

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。