clue / packagist-api-react
使用ReactPHP构建的简单异步访问packagist.org的API,如列出项目详情、下载次数等。
Requires
- php: >=5.3
- clue/buzz-react: ^2.5
- knplabs/packagist-api: ~1.0
- rize/uri-template: ^0.3
Requires (Dev)
- phpunit/phpunit: ^6.0 || ^5.7 || ^4.8.35
README
使用ReactPHP构建的简单异步访问packagist.org的API,如列出项目详情、下载次数等。
这是KnpLab优秀的packagist-api
的异步版本,但基于ReactPHP的非阻塞event-loop
构建。它使用异步HTTP客户端库clue/reactphp-buzz
并行处理任意数量的请求。简而言之,它允许您并行向packagist API发出多个请求,并在结果到达时无序处理它们 - 同时试图隐藏所有异步处理的细节。在此基础上,它提供了一个非常易于使用的API,与原始的packagist-api
非常相似,并增加了ReactPHP的Promise的便利性。
目录
快速入门示例
安装后,您可以使用以下代码从packagist.org获取包信息
$loop = React\EventLoop\Factory::create(); $browser = new Clue\React\Buzz\Browser($loop); $client = new Client($browser); $client->get('clue/phar-composer')->then(function (Package $package) { var_dump($package->getName(), $package->getDescription()); }); $loop->run();
另请参阅示例。
使用方法
客户端
Client
负责组装和发送HTTP请求到远程Packagist API。它需要一个绑定到主要EventLoop
的Browser
对象,以处理异步请求
$loop = React\EventLoop\Factory::create(); $browser = new Clue\React\Buzz\Browser($loop); $client = new Client($browser);
如果您需要自定义连接器设置(DNS解析、TLS参数、超时、代理服务器等),您可以显式地向Browser
实例传递自定义的ConnectorInterface
实例
$connector = new \React\Socket\Connector($loop, array( 'dns' => '127.0.0.1', 'tcp' => array( 'bindto' => '192.168.10.1:0' ), 'tls' => array( 'verify_peer' => false, 'verify_peer_name' => false ) )); $browser = new Browser($loop, $connector); $client = new Client($browser);
Promise
Client
上的所有公共方法都类似于KnpLab的packagist-api
提供的API,除了它们的返回值具有异步转换:发送请求是异步的(非阻塞的),因此您可以实际并行发送多个请求。Packagist将对每个请求返回一个响应消息,顺序没有保证。发送请求使用基于Promise的接口,这使得在请求得到满足时(即成功解决或因错误而被拒绝)做出反应变得很容易。
$client->get('clue/graph-composer')->then( function ($result) { // result received for get() function }, function (Exception $e) { // an error occured while executing the request } });
取消
返回的Promise实现为可以在它仍然是挂起的时取消。取消挂起的Promise将使用异常拒绝其值,并清理任何底层资源。
$promise = $client->get('clue/graph-composer'); $loop->addTimer(2.0, function () use ($promise) { $promise->cancel(); });
超时
该库使用了一个非常高效的HTTP实现,因此大多数API请求通常只需几毫秒即可完成。然而,当通过不可靠的网络(互联网)发送API请求时,可能会出现一些问题,导致请求在一段时间后失败。因此,超时由底层的HTTP库处理,并且该库会尊重PHP的default_socket_timeout
设置(默认60秒)作为发送外出API请求和等待成功响应的超时时间,否则将取消挂起的请求并使用异常拒绝其值。
请注意,此超时值包括创建底层传输连接、发送API请求、等待Packagist服务处理请求以及接收完整的API响应。要传递自定义超时值,可以像这样分配底层的timeout
选项
$browser = new Browser($loop); $browser = $browser->withOptions(array( 'timeout' => 10.0 )); $client = new Client($browser); $client->get('clue/graph-composer')->then(function ($result) { // result received within 10 seconds maximum var_dump($result); });
同样,您可以使用负超时值来不应用超时,或使用null
值来恢复默认处理。请注意,底层连接可能仍会强制不同的超时值。有关更多详细信息,请参阅底层的timeout
选项。
search()
可以使用search(string $query, array $filters = array()): PromiseInterface<Package[],Exception>
方法来搜索与给定查询字符串匹配的包,并可选地匹配给定的过滤参数。
它成功解析为包含零个或多个Package
对象的数组,或在出错时拒绝并返回一个Exception
。
$client->search('packagist')->then(function (array $packages) { foreach ($packages as $package) { echo $package->getName() . PHP_EOL; } });
请注意,此方法遵循Packagist的分页搜索结果,根据您的搜索,可能包含大量匹配项。因此,此方法为每一页发送一个API请求,整个搜索可能需要一些时间。对于1000个匹配项,获取搜索结果通常需要大约5-10秒。
get()
可以使用get(string $name): PromiseInterface<Package,Exception>
方法来获取给定包名的包详细信息。
它成功解析为单个Package
对象,或在出错时拒绝并返回一个Exception
。
$client->get('clue/packagist-api-react')->then(function (Package $package) { echo $package->getDescription(); });
all()
可以使用all(array $filters = array()): PromiseInterface<string[],Exception>
方法列出所有包名,可选地匹配给定的过滤参数。
它成功解析为包含包名的数组,或在出错时拒绝并返回一个Exception
。
$client->all(array('vendor' => 'clue'))->then(function (array $names) { // array containing (among others) "clue/packagist-api-react" });
包
Package
类表示有关给定composer包的信息。该类是底层KnpLab/packagist-api的一部分,其全名实际上是Packagist\Api\Result\Package
。
请参阅其类概要以获取所有可用方法。
getName()
可以使用getName()
方法获取包名。
getDescription()
可以使用getDescription()
方法获取包描述。
安装
安装此库的推荐方式是通过Composer。 您是Composer的新手吗?
此项目遵循SemVer。这将安装最新的支持版本
$ composer require clue/packagist-api-react:^1.3
有关版本升级的详细信息,请参阅CHANGELOG。
此项目旨在在所有平台上运行,因此不需要任何PHP扩展,并支持在旧版PHP 5.3到当前PHP 8+和HHVM上运行。强烈建议使用PHP 7+。
测试
要运行测试套件,首先需要克隆此仓库,然后通过Composer安装所有依赖项
$ composer install
要运行测试套件,请转到项目根目录并运行
$ php vendor/bin/phpunit
许可
本项目采用宽松的MIT许可证发布。
你知道吗?我提供定制开发服务和为发布和贡献发放发票的服务。如有需要,请联系我(@clue)获取详细信息。