此包已被废弃,不再维护。未建议替代包。

轻量级HTTP客户端

1.2.0 2020-10-22 09:05 UTC

README

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

Buzz 是一个轻量级(小于1000行代码)的PHP 7.1库,用于发送HTTP请求。该库包括三个客户端:FileGetContentsCurlMultiCurlMultiCurl 支持批量请求和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承诺的极大启发,我们采用了他们弃用类、接口和函数的方法。

运行测试

此库有2种测试;单元测试和集成测试。它们可以通过以下方式单独运行

./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