mix / jsonrpc-client
This package is abandoned and no longer maintained.
No replacement package was suggested.
MixPHP 框架模块 http://www.mixphp.cn
v2.0.1
2019-04-24 11:37 UTC
Requires
- php: >=7.0.0
This package is auto-updated.
Last update: 2021-08-25 14:17:25 UTC
README
Mix PHP 本身提供了基于 TCP 协议的 RPC 服务器开发,这里是 RPC 的客户端,负责与服务器通信。
安装
使用 Composer 安装:
composer require mix/jsonrpc-client
传统调用
在 Mix PHP 的常驻同步模式中使用,也可在 TP/Yii/Laravel 等传统框架中使用。
$client = new \Mix\JsonRpc\Client\Compatible\JsonRpcTcpClient([
'host' => '127.0.0.1',
'port' => 9503,
'timeout' => 5,
]);
$method = 'hello.world';
$params = [];
$id = 0;
$ret = $client->call($method, $params, $id);
var_dump($ret);
协程调用
在 Mix PHP 的常驻协程模式中使用,可并行获取多个请求结果,性能是传统框架的同步方式无法比拟的,这种方法使用简单,但是因为是短连接,所以在并发极高时会导致 TIME_WAIT 较高,使用连接池则没有这个问题。
$chan1 = new \Mix\Core\Coroutine\Channel();
xgo(function () use ($chan1) {
$client = new \Mix\JsonRpc\Client\Coroutine\JsonRpcTcpClient([
'host' => '127.0.0.1',
'port' => 9503,
'timeout' => 5,
]);
$method = 'hello.world';
$params = [];
$id = 0;
try {
$ret = $client->call($method, $params, $id);
$chan1->push($ret);
} catch (\Throwable $e) {
$chan1->push(null);
}
});
$chan2 = new \Mix\Core\Coroutine\Channel();
xgo(function () use ($chan2) {
$client = new \Mix\JsonRpc\Client\Coroutine\JsonRpcTcpClient([
'host' => '127.0.0.1',
'port' => 9503,
'timeout' => 5,
]);
$method = 'hello.world';
$params = [];
$id = 0;
try {
$ret = $client->call($method, $params, $id);
$chan2->push($ret);
} catch (\Throwable $e) {
$chan2->push(null);
}
});
list($ret1, $ret2) = [$chan1->pop(), $chan2->pop()];
// 可对两次请求的结果做计算并发送给客户端
连接池调用
与 Mix PHP 内置的 Database/Redis 池使用方法一至,首先在依赖配置中配置依赖:
// 连接池
[
// 类路径
'class' => Mix\JsonRpc\Client\Pool\ConnectionPool::class,
// 属性
'properties' => [
// 最多可空闲连接数
'maxIdle' => 5,
// 最大连接数
'maxActive' => 50,
// 拨号器
'dialer' => [
// 依赖引用
'ref' => beanname(Common\Libraries\Dialers\JsonRpcTcpClientDialer::class),
],
],
],
// 连接池拨号
[
// 类路径
'class' => Common\Libraries\Dialers\JsonRpcTcpClientDialer::class,
],
// JsonRpc客户端
[
// 类路径
'class' => Mix\JsonRpc\Client\Coroutine\JsonRpcTcpClient::class,
// 属性
'properties' => [
// 地址
'host' => '127.0.0.1',
// 端口
'port' => 9503,
// 超时
'timeout' => 5,
],
],
注册组件:
// 连接池
'rpcPool' => [
// 依赖引用
'ref' => beanname(Mix\JsonRpc\Client\Pool\ConnectionPool::class),
],
增加 IDE 提示:
修改 ApplicationInterface.php
增加注释。
@property \Mix\JsonRpc\Client\Pool\ConnectionPool $rpcPool
新增一个拨号类:
applications\common\src\Libraries\Dialers\JsonRpcTcpClientDialer.php
<?php
namespace Common\Libraries\Dialers;
use Mix\Pool\DialerInterface;
/**
* Class JsonRpcTcpClientDialer
* @package Common\Libraries\Dialers
* @author liu,jian <coder.keda@gmail.com>
*/
class JsonRpcTcpClientDialer implements DialerInterface
{
/**
* 拨号
* @return \Mix\JsonRpc\Client\Coroutine\JsonRpcTcpClient
*/
public function dial()
{
return \Mix\JsonRpc\Client\Coroutine\JsonRpcTcpClient::newInstance();
}
}
代码中使用 JsonRpcTcpClient 池:
$chan1 = new \Mix\Core\Coroutine\Channel();
xgo(function () use ($chan1) {
$rpc = app()->rpcPool->getConnection();
$method = 'hello.world';
$params = [];
$id = 0;
try {
$ret = $rpc->call($method, $params, $id);
$rpc->release(); // 不手动释放的连接不会归还连接池,会在析构时丢弃
$chan1->push($ret);
} catch (\Throwable $e) {
$chan1->push(null);
}
});
$chan2 = new \Mix\Core\Coroutine\Channel();
xgo(function () use ($chan2) {
$rpc = app()->rpcPool->getConnection();
$method = 'hello.world';
$params = [];
$id = 0;
try {
$ret = $rpc->call($method, $params, $id);
$rpc->release(); // 不手动释放的连接不会归还连接池,会在析构时丢弃
$chan2->push($ret);
} catch (\Throwable $e) {
$chan2->push(null);
}
});
list($ret1, $ret2) = [$chan1->pop(), $chan2->pop()];
// 可对两次请求的结果做计算并发送给客户端
License
Apache License Version 2.0, http://www.apache.org/licenses/