diablomedia / guzzle-throttle-middleware
一个GuzzleHTTP中间件,可以在发送请求前延迟请求。
1.0.1
2024-06-04 17:35 UTC
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- bentools/psr7-request-matcher: ^1.0
- guzzlehttp/guzzle: ^7.0
- psr/log: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- bentools/guzzle-duration-middleware: dev-guzzle-7 as 1.0
- friendsofphp/php-cs-fixer: ^3.54
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5.0
- psr/cache: ^1.0
- symfony/cache: ^3.3
- symfony/var-dumper: ^3.3
README
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等)。
然后您可以在工作进程中启用节流。
另请参阅
- bentools/guzzle-queue-handler - 一个队列处理程序,用于在作业队列中处理Guzzle 6+请求。
- kevinrob/guzzle-cache-middleware - Guzzle 6的HTTP缓存。它是一个简单的中间件,可以添加到HandlerStack中。
- bentools/guzzle-duration-middleware - Guzzle 6+中间件,为所有响应添加X-Request-Duration标头以监控响应时间。