diablomedia/guzzle-throttle-middleware

一个GuzzleHTTP中间件,可以在发送请求前延迟请求。

1.0.1 2024-06-04 17:35 UTC

This package is auto-updated.

Last update: 2024-09-04 18:17:09 UTC


README

Latest Stable Version License Build Total Downloads codecov

Guzzle Throttle Middleware

此中间件为您添加Guzzle客户端的节流功能。

当某些主机限制了每秒/每分钟请求的数量时,这可能很有用。

安装

composer require diablomedia/guzzle-throttle-middleware

计数器存储

默认情况下,请求计数器存储在数组中。

但您可以使用 PSR6Adapter 将计数器存储在 psr/cache 实现(例如 symfony/cache),并使用Redis、APCu、Memcached等共享存储。

使用方法

为了使此中间件正常工作,您需要注册一些配置。

一个配置由以下部分组成

  • 请求匹配器(根据请求内容触发或禁用节流器)
  • 最大请求数量
  • 适用最大请求数量的时间段(以秒为单位)。
  • 存储密钥。

您可以注册所需的所有配置。第一个请求匹配器优先。

示例

namespace App\RequestMatcher;

use BenTools\Psr7\RequestMatcherInterface;
use Psr\Http\Message\RequestInterface;

class ExampleOrgRequestMatcher implements RequestMatcherInterface
{
    /**
     * @inheritDoc
     */
    public function matchRequest(RequestInterface $request)
    {
        return false !== strpos($request->getUri()->getHost(), 'example.org');
    }
}
use App\RequestMatcher\ExampleOrgRequestMatcher;
use BenTools\GuzzleHttp\Middleware\Storage\Adapter\ArrayAdapter;
use BenTools\GuzzleHttp\Middleware\ThrottleConfiguration;
use BenTools\GuzzleHttp\Middleware\ThrottleMiddleware;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

require_once __DIR__ . '/vendor/autoload.php';

$stack = HandlerStack::create();
$middleware = new ThrottleMiddleware(new ArrayAdapter());

// Max 1 request per second
$maxRequests = 1;
$durationInSeconds = 1;
$middleware->registerConfiguration(
    new ThrottleConfiguration(new ExampleOrgRequestMatcher(), $maxRequests, $durationInSeconds, 'example')
);

$stack->push($middleware, 'throttle');
$client = new Client([
    'handler' => $stack,
]);

$client->get('http://www.example.org'); // Will be executed immediately
$client->get('http://www.example.org'); // Will be executed in 1 second

测试

./vendor/bin/phpunit

已知问题

由于PHP的同步行为,请记住,节流意味着调用 sleep()usleep() 函数,这将延迟整个脚本,而不仅仅是当前请求。

这意味着节流也会在使用 CurlMultiHandler 时阻止Guzzle的异步请求。

为了防止这种情况,您可以考虑查看 bentools/guzzle-queue-handler,这是一个将异步请求委托给PHP工作进程的处理程序(Beanstalk、RabbitMQ、Redis等)。

然后您可以在工作进程中启用节流。

另请参阅