这里用swoole_client 举个例子( swoft2.*)
法一:
$client = new \swoole_client(SWOOLE_SOCK_TCP);
if (!$client->connect('10.10.10.15', 18307, 0.5))
{
return "connect failed. Error: {$client->errCode}\n";
}
$client->send(json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", \App\Rpc\Lib\UserInterface::class, 'getList'),
'params' => [1,2],
'id' => '',
'ext' => []
])."\r\n\r\n");// 旧版不需要追加\r\n
//或者使用字符串传递接口类名 ,上边的还可以写为,如下
$client->send(json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", 'App\Rpc\Lib\UserInterface', 'getList'),
'params' => [1,2],
'id' => '',
'ext' => []
])."\r\n\r\n");// 旧版不需要追加\r\n
$result = $client->recv();
$client->close();
return json_decode($result,true);
法二:
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, '127.0.0.1', 18307);
socket_write($client, json_encode([
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", "1.2", \App\Rpc\Lib\UserInterface::class, 'getList'),
'params' => [1, 2],
'id' => '',
'ext' => []
]) . "\r\n\r\n");
$buf = socket_read($client, 8024);
$response = json_decode($buf, true);
return $response;
法三(官方文档)
<?php const RPC_EOL = "\r\n\r\n"; function request($host, $class, $method, $param, $version = '1.0', $ext = []) {
$fp = stream_socket_client($host, $errno, $errstr);
if (!$fp) {
throw new Exception("stream_socket_client fail errno={$errno} errstr={$errstr}");
} $req = [
"jsonrpc" => '2.0',
"method" => sprintf("%s::%s::%s", $version, $class, $method),
'params' => $param,
'id' => '',
'ext' => $ext,
];
$data = json_encode($req) . RPC_EOL;
fwrite($fp, $data); $result = '';
while (!feof($fp)) {
$tmp = stream_socket_recvfrom($fp, 1024); if ($pos = strpos($tmp, RPC_EOL)) {
$result .= substr($tmp, 0, $pos);
break;
} else {
$result .= $tmp;
}
} fclose($fp);
return json_decode($result, true);
} $ret = request('tcp://127.0.0.1:18307', \App\Rpc\Lib\UserInterface::class, 'getList', [1, 2], "1.0");var_dump($ret);
(以上亲测都可用)非常的简单易用, 但是需要注意一点:
1. interface 参数是服务端带命名空间的类名, 跟客户端没任何关系, 完全取决于服务端把RPC 接口类放在哪儿…
2. interface 参数 可以传字符串 ,如示例
$client = new \swoole_client(SWOOLE_SOCK_TCP);
if (! $client->connect('192.168.1.214', 8099, 0.5))
{
return "connect failed. Error: {$client->errCode}\n";
}
$client->send(json_encode([
"interface" => "App\Lib\MemberInterface",
"version" => "0",
"method" => "getMemberByID",
"params" => [$mid],
])."\r\n");// 旧版不需要追加\r\n
$result = $client->recv();
$client->close();
return $result;
非常的简单易用, 但是需要注意一点:
interface 参数是服务端带命名空间的类名, 跟客户端没任何关系, 完全取决于服务端把RPC 接口类放在哪儿…
作者:断言
链接:http://www.imooc.com/article/details/id/278283
来源:慕课网
