kriswallsmith / buzz
轻量级HTTP客户端
Requires
- php: ^7.1 || ^8.0
- php-http/httplug: ^1.1 || ^2.0
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.0
- symfony/options-resolver: ^3.4 || ^4.0 || ^5.0 || ^6.0
Requires (Dev)
- nyholm/psr7: ^1.0
- php-http/client-integration-tests: ^3.0
- phpunit/phpunit: ^7.5 || ^9.4
- psr/log: ^1.0
Suggests
- ext-curl: To use our cUrl clients
- nyholm/psr7: For PSR-7 and PSR-17 implementation
Provides
This package is auto-updated.
Last update: 2024-08-30 23:06:02 UTC
README
Buzz是一个轻量级(少于1000行代码)的PHP 7.1库,用于发送HTTP请求。该库包含三个客户端:FileGetContents
、Curl
和MultiCurl
。其中MultiCurl
支持批量请求和HTTP2服务器推送。
安装
运行以下命令进行安装
composer require kriswallsmith/buzz
您还需要安装一个PSR-17请求/响应工厂。Buzz使用该工厂创建PSR-7请求和响应。您可以从此列表中选择一个进行安装。
示例
composer require nyholm/psr7
用法
此页面仅展示基础知识,请阅读完整文档。
use Buzz\Browser; use Buzz\Client\FileGetContents; $client = new FileGetContents(new Psr17ResponseFactory()); $browser = new Browser($client, new Psr17RequestFactory()); $response = $browser->get('https://www.google.com'); echo $browser->getLastRequest()."\n"; // $response is a PSR-7 object. echo $response->getStatusCode();
您也可以直接使用低级HTTP类。
use Buzz\Client\FileGetContents; $request = new PSR7Request('GET', 'https://google.com/foo'); $client = new FileGetContents(new Psr17ResponseFactory()); $response = $client->sendRequest($request, ['timeout' => 4]); echo $response->getStatusCode();
注意
两个new Psr17ResponseFactory()
和new Psr17RequestFactory()
是占位符,用于您选择的任何PSR-17工厂。如果您使用nyholm/psr7
,则上面的示例将开始如下
use Buzz\Browser; use Buzz\Client\FileGetContents; use Nyholm\Psr7\Factory\Psr17Factory; $client = new FileGetContents(new Psr17Factory()); $browser = new Browser($client, new Psr17Factory()); $response = $browser->get('https://www.google.com');
HTTP2服务器推送
Buzz MultiCurl客户端支持HTTP2服务器推送。
use Buzz\Client\MultiCurl; use Nyholm\Psr7\Factory\Psr17Factory; use Nyholm\Psr7\Request; $client = new MultiCurl(new Psr17Factory()); $start = microtime(true); $response = $client->sendRequest(new Request('GET', 'https://http2.golang.org/serverpush', [], null, '2.0')); $timeFirstRequest = microtime(true) - $start; // Parse response to find asset version. $body = $response->getBody()->__toString(); $id = null; if (preg_match('#/serverpush/static/style.css\?([0-9]+)#sim', $body, $matches)) { $id = $matches[1]; } // Make two new requests $start = microtime(true); $client->sendRequest(new Request('GET', 'https://http2.golang.org/serverpush/static/style.css?'.$id)); $client->sendRequest(new Request('GET', 'https://http2.golang.org/serverpush/static/playground.js?'.$id)); $timeOtherRequests = microtime(true) - $start; echo 'First: '.$timeFirstRequest."\n"; echo 'Other: '.$timeOtherRequests."\n";
由于其他两个请求已被推送,我们没有花费时间获取这些请求。
First: 1.04281
Other: 0.00027
您可以使用push_function_callback
选项配置要接受推送的请求。
Buzz的理念
Buzz是由Kris Wallsmith在2010年创建的。该项目在几年内变得非常受欢迎,下载量超过700万。
自2017年8月起,Tobias Nyholm一直维护此库。Buzz的理念将保持不变,我们应该有一个简单的API并模仿浏览器行为以方便测试。我们不希望重新发明轮子,也不希望像其他客户端(如Guzzle)那样强大和灵活。然而,我们非常重视性能。
我们热爱PSR,这是我们希望支持的PSR列表
- PSR-1(代码风格)
- PSR-2(代码风格)
- PSR-4(自动加载)
- PSR-7(HTTP消息)
- PSR-17(HTTP工厂)
- PSR-18(HTTP客户端)
目标
自从1.0版本发布以来,Buzz已经实现了成为一个涵盖所有用例90%的轻量级客户端的目标。没有计划积极开发新功能或更改现有API。对于那些想要更积极维护的HTTP客户端的人来说,有其他替代方案。其中特别受欢迎的是拥有庞大社区支持的
Symfony HTTP客户端.
贡献
Buzz之所以优秀,是因为它小巧、简单且灵活。我们总是很高兴收到错误报告和错误修复。我们也期待审查包含新中间件的拉取请求,特别是如果该中间件涵盖了常见用例的话。
我们可能不会接受任何针对客户端或浏览器的配置选项或功能。
向后兼容性承诺
我们非常重视向后兼容性,正如您应该对待任何开源项目一样。我们严格遵循Semver。请注意,Semver在版本1.0.0之前的工作方式略有不同。1.0.0之前的次要版本允许破坏向后兼容性。
受到Symfony的bc承诺的极大启发,我们采用了他们弃用类、接口和函数的方法。
运行测试
本库有两种测试类型:单元测试和集成测试。它们可以通过以下方式独立运行:
./vendor/bin/phpunit --testsuite Unit ./vendor/bin/phpunit --testsuite Integration
集成测试会对Web服务器进行真实的HTTP请求。我们的集成测试使用了两个不同的Web服务器:真实的Nginx服务器和PHP内置的Web服务器。使用PHP的Web服务器运行的测试由php-http/client-integration-tests
提供。
要启动服务器,请打开终端A并运行:
./vendor/bin/http_test_server
另一种类型的集成测试使用Nginx。我们使用Docker启动Nginx服务器。
docker build -t buzz/tests .
docker run -d -p 127.0.0.1:8022:80 buzz/tests
现在您已经准备好运行集成测试了
./vendor/bin/phpunit --testsuite Integration
测试服务器推送
要使用HTTP/2服务器推送,您需要运行最新的PHP版本。PHP还需要使用cUrl > 7.61.1,并编译带有libnghttp2。您可以使用docker
composer update
docker run -it --rm --name php-latest -v "$PWD":/usr/src/myapp -w /usr/src/myapp tommymuehle/docker-alpine-php-nightly \
php vendor/bin/phpunit tests/Integration/MultiCurlServerPushTest.php