btafoya/fxmlrpc

快速且小巧的XML/RPC客户端,支持各种HTTP客户端的桥梁

1.0.0 2019-04-04 22:27 UTC

This package is auto-updated.

Last update: 2024-09-05 10:34:07 UTC


README

  • 方便的、面向对象的API(类似于Zend Framework中的XML/RPC客户端)
  • 非常快速地序列化和解析涉及的XML负载
  • 坚持使用您已经使用的HTTP客户端:Buzz、ZF1/ZF2 HTTP客户端、Guzzle、PECL HTTP
  • 根据MIT许可协议的条款许可
  • 支持现代标准:通过composer轻松安装,完全兼容PSR-0、PSR-1和PSR-2
  • 不懈地进行单元和集成测试
  • 实现了所有已知的XML/RPC扩展

最新改进

  • [BUG] 修复了XmlWriterSerializer中的重大问题(详细信息见#4)
  • [FEATURE] 为多调用提供特殊的API
  • [FEATURE] 支持所有Java XML/RPC扩展
  • [BC] fXmlRpc\AbstractDecoratorfXmlRpc\ClientInterface现在包括添加和附加参数的方法
  • [BC] fXmlRpc\Client被标记为final。属性被标记为private。通过装饰器扩展。
  • [BC]fXmlRpc\Value\Base64的已弃用构造函数标记为private。此外,值对象现在是final的
  • [TESTING] 对Java XML/RPC和Python XML/RPC进行集成测试
  • [BUG] 修复了隐式字符串类型处理(字符串不是值的子项)
  • [IMPROVEMENT] 改进了异常处理
  • [BC] 将命名方案更改为studly caps
  • [BUG] 修复了各种数组/struct边界情况
  • [IMPROVEMENT] 序列化和解析器的小型内存和性能改进
  • [BC] 弃用了fXmlRpc\Value\Base64的已弃用构造函数,并引入了::serialize()::deserialize()
  • [FEATURE] 添加了fXmlRpc\Client::prependParams()fXmlRpc\Client::appendParams()来设置默认参数。这有助于例如您需要为每个调用添加授权信息时
  • [FEATURE] 时间日志记录器现在支持基于阈值的日志记录,以简化控制您的服务器在一定时间内的响应
  • [TESTING] Travis现在运行针对支持的HTTP客户端和日志组件的各个版本的测试套件。

它真的有多快?

从用户空间的角度来看,I/O性能超出了范围,但解析和序列化速度才是关键。我们能够多快地从PHP数据结构生成XML负载?我们能够多快地解析服务器的响应?fXmlRpc使用基于流的XML写入器/读取器来实现其性能,并对此进行了大量的优化(即丑化)。因此,用户空间版本仅比本机C实现(ext/xmlrpc)慢约2倍。

解析器

Zend\XmlRpc\Value (ZF2): 249.02972793579 sec
Zend_XmlRpc_Value (ZF1): 253.88145494461 sec
fXmlRpc\Parser\XmlReaderParser: 36.274516105652 sec
fXmlRpc\Parser\NativeParser: 18.652323007584 sec

序列化器

Zend\XmlRpc\Request (ZF2): 52.004573106766 sec
Zend_XmlRpc_Request (ZF1): 65.042532920837 sec
fXmlRpc\Serializer\XmlWriterSerializer: 23.652673006058 sec
fXmlRpc\Serializer\NativeSerializer: 9.0790779590607 sec

用法

基本用法

<?php
$client = new fXmlRpc\Client('http://endpoint.com');
$client->call('remoteMethod', array('arg1', true));

使用本机(基于ext/xmlrpc的)序列化器/解析器(以获得更好的性能)

<?php
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    null,
    new fXmlRpc\Parser\NativeParser(),
    new fXmlRpc\Serializer\NativeSerializer()
);
$client->call('remoteMethod', array('arg1', true));

添加和附加参数

<?php
$client = new fXmlRpc\Client('http://endpoint.com');
$client->prependParams(array('username', 'password'));
$client->appendParams(array('appended'));
...

使用方便的代理对象

<?php
$proxy = new fXmlRpc\Proxy(new fXmlRpc\Client('http://endpoint.com'));
// Call system.echo
$proxy->system->echo('Hello World!');

多调用请求的有用抽象

<?php
$result = $client->multicall()
    ->addCall('system.add', array(1, 2))
    ->addCall(
        'system.add',
        array(2, 3),
        function ($result) {
            echo "Result was: " . $result;
        },
        function($result) {
            echo "An error occured: " . var_export($result, true);
        }
    )
    ->onSuccess(function ($result) {echo "Success";}) // Success handler for each call
    ->onError(function ($result) {echo "Error";}) // Error handler for each call
    ->execute();

与各种HTTP客户端的集成

<?php
/** Buzz (https://github.com/kriswallsmith/Buzz) */
$browser = new Buzz\Browser();
$browser->...();
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    new fXmlRpc\Transport\BuzzBrowserBridge($browser)
);

/** Zend Framework 1 (http://framework.zend.com/) */
$httpClient = new Zend_Http_Client();
$httpClient->...();
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    new fXmlRpc\Transport\ZF1HttpClientBridge($httpClient)
);

/** Zend Framework 2 (http://framework.zend.com/zf2) */
$httpClient = new Zend\Http\Client();
$httpClient->...();
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    new fXmlRpc\Transport\ZF2HttpClientBridge($httpClient)
);

/** Guzzle (http://guzzlephp.org/) */
$httpClient = new Guzzle\Http\Client();
$httpClient->...();
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    new fXmlRpc\Transport\GuzzleBridge($httpClient)
);

/** PECL HTTP (http://pecl.php.net/pecl_http) */
$request = new HttpRequest();
$request->...();
$client = new fXmlRpc\Client(
    'http://endpoint.com',
    new fXmlRpc\Transport\PeclHttpBridge($request)
);

对XML/RPC请求进行时间跟踪,以找到有问题的调用

fXmlRpc允许您跟踪您的XML/RPC请求,以找出哪些花费了多长时间。它提供了一个fXmlRpc\Timing\TimingDecorator,可以与实现fXmlRpc\Timing\TimerInterface的各种计时器一起使用。目前实现了Monolog、Zend Framework 1 Zend_Log和Zend Framework 2 Zend\Log的桥梁。

用法

<?php
$client = new fXmlRpc\Timing\TimingDecorator(
    new fXmlRpc\Client(...),
    new fXmlRpc\Timing\MonologTimerBridge(
        $monolog,
        Monolog\Logger::ALERT,
        'My custom log message template %F'
    )
);