轻量级HTTP客户端

安装数: 27,902,186

依赖者: 551

建议者: 55

安全性: 0

星标: 1,921

关注者: 60

分支: 251

开放问题: 12

1.2.1 2022-03-25 13:55 UTC

README

Build Status BC Check Latest Version Code Coverage Quality Score Total Downloads Monthly Downloads

Buzz是一个轻量级(少于1000行代码)的PHP 7.1库,用于发送HTTP请求。该库包含三个客户端:FileGetContentsCurlMultiCurl。其中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