clue / viewvc-api-react
简单、异步访问 ViewVC 网页界面(Subversion/CVS 浏览器)
Requires
- php: >=5.3
- ext-simplexml: *
- clue/buzz-react: ^0.5
- clue/promise-stream-react: ^0.1
- neitanod/forceutf8: ~1.4
- react/event-loop: ~0.4.0|~0.3.0
- react/promise: ~2.1|~1.1
- rize/uri-template: ^0.3
Requires (Dev)
- clue/block-react: ~0.3.0
README
简单、异步API-like访问您的 ViewVC 网页界面(Subversion/CVS 浏览器),基于 React PHP 构建。
目录
快速入门示例
安装后,您可以使用以下代码从给定的 ViewVC URL 获取目录列表
$loop = React\EventLoop\Factory::create(); $browser = new Clue\React\Buzz\Browser($loop); $client = new Client($browser->withBase('http://example.com/viewvc/')); $client->fetchDirectory('/')->then(function ($files) { echo 'Files: ' . implode(', ', $files) . PHP_EOL; }); $loop->run();
请参阅示例。
使用方法
客户端
Client
负责组装并发送 HTTP 请求到远程 ViewVC 网页界面。它需要一个绑定到主 EventLoop
的 Browser
对象以处理异步请求
$loop = React\EventLoop\Factory::create(); $browser = new Clue\React\Buzz\Browser($loop); $client = new Client($browser->withBase('http://example.com/viewvc/'));
Client
API 使用相对 URI 来引用您的 ViewVC 安装中的文件和目录,因此请确保按照上述说明应用基本 URI。
如果您需要自定义 DNS 或代理设置,您可以显式传递一个自定义的 Browser
实例。
操作
ViewVC 并没有官方公开 API。但是,它的 REST-like URL 使构建正确请求并从其 HTML 输出中抓取结果变得容易。所有公共方法都类似于 ViewVC 网页界面中可用的相应操作。
$client->fetchDirectory($path, $revision = null); $client->fetchFile($path, $revision = null); $client->fetchPatch($path, $r1, $r2); $client->fetchLog($path, $revision = null); // many more…
所有操作都通过返回 承诺 来支持异步操作。
此处不列出所有可用的操作,请参阅 类概要。
承诺
发送请求是异步(非阻塞)的,因此您可以实际并行发送多个请求。ViewVC 将对每个请求使用响应消息进行响应,顺序没有保证。发送请求使用基于 Promise 的接口,这使得在请求完成时(即成功解决或因错误而拒绝)进行响应变得容易。
$client->fetchFile($path)->then( function ($contents) { // file contents received }, function (Exception $e) { // an error occured while executing the request } });
如果您对此感到奇怪,您还可以使用更传统的 阻塞 API。
阻塞
如上所述,此库默认提供强大的异步 API。
但是,如果您想将其集成到传统的阻塞环境中,您还应该考虑使用 clue/block-react。
生成的阻塞代码可能如下所示
use Clue\React\Block; $loop = React\EventLoop\Factory::create(); $browser = new Clue\React\Buzz\Browser($loop); $client = new Client($browser->withBase($uri /* change me */)); $promise = $client->fetchFile($path /* change me */); try { $contents = Block\await($promise, $loop); // file contents received } catch (Exception $e) { // an error occured while executing the request }
有关详细信息,请参阅 clue/block-react。
流式传输
以下 API 端点解析为字符串形式的文件内容
$client->fetchFile($path);
请注意,这意味着整个字符串必须保留在内存中。这对于启动来说很容易,并且对于较小的文件来说表现良好。
对于大文件,通常更好的做法是使用流式传输方法,其中只需保留少量内存。这对于任意大小的(任何数量的)文件都适用。
以下API端点补充了默认的基于Promise的API,并返回一个实现ReadableStreamInterface
的实例
$stream = $client->fetchFileStream($path); $stream->on('data', function ($chunk) { echo $chunk; }); $stream->on('error', function (Exception $error) { echo 'Error: ' . $error->getMessage() . PHP_EOL; }); $stream->on('close', function () { echo '[DONE]' . PHP_EOL; });
安装
推荐通过Composer来安装此库。 初识Composer?
这将安装最新支持的版本
$ composer require clue/viewvc-api-react:^0.4
有关版本升级的详细信息,请参阅变更日志。
许可证
MIT