clue/packagist-api-react

使用ReactPHP构建的简单异步访问packagist.org的API,如列出项目详情、下载次数等。

v1.3.0 2019-02-20 13:04 UTC

This package is auto-updated.

Last update: 2024-08-29 04:16:58 UTC


README

CI status installs on Packagist

使用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。它需要一个绑定到主要EventLoopBrowser对象,以处理异步请求

$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)获取详细信息。