bentools / guzzle-throttle-middleware
一个GuzzleHTTP中间件,可以在发送请求前延迟请求。
0.4.1
2018-02-16 13:49 UTC
Requires
- php: >=7.0
- bentools/psr7-request-matcher: ^1.0
- guzzlehttp/guzzle: ^6.0
- psr/log: ^1.0
Requires (Dev)
- bentools/guzzle-duration-middleware: ^1.0
- phpunit/phpunit: @stable
- psr/cache: ^1.0
- satooshi/php-coveralls: @stable
- squizlabs/php_codesniffer: @stable
- symfony/cache: ^3.3
- symfony/var-dumper: ^3.3
README
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等)的处理程序。
然后您可以在工作进程中启用节流。
另请参阅
- bentools/guzzle-queue-handler - 一个队列处理程序,用于在工作队列中处理Guzzle 6+请求。
- kevinrob/guzzle-cache-middleware - Guzzle 6的HTTP缓存。这是一个简单的中间件,可在HandlerStack中添加。
- bentools/guzzle-duration-middleware - Guzzle 6+中间件,为所有响应添加X-Request-Duration头,以监控响应时间。