bentools/guzzle-throttle-middleware

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

0.4.1 2018-02-16 13:49 UTC

This package is auto-updated.

Last update: 2024-08-24 19:27:40 UTC


README

Latest Stable Version License Build Status Coverage Status Quality Score Total Downloads

Guzzle Throttle Middleware

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

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

安装

composer require bentools/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等)的处理程序。

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

另请参阅