介绍
Yar
是一个 RPC
框架,它提供了一种简单易用的方式来在 PHP
应用程序之间进行通信,它还提供了同时对远程服务进行多个调用的能力。
特征
- 快速、简单
- 并发 RPC 调用
- 支持多种数据打包器(php、json、msgpack 内置)
- 支持多种传输协议(http、https、TCP)
- 详细的调试信息
扩展地址如以下,截止到(2022.09.10):
安装
安装yar
Yar 是一个 PECL 扩展,可以简单地通过以下方式安装:
pecl install yar
在 Linux 中编译 Yar
1 2 3
| $ /path/to/phpize $ ./configure --with-php-config=/path/to/php-config/ $ make && make install
|
可用的配置说明
1 2 3
| --with-curl=DIR --enable(disable)-msgpack --enable(disable)-epoll (require Yar 2.1.2)
|
使用 msgpack 安装 Yar
1.为 PHP 扩展安装 msgpack:
pecl install msgpack
或者对于 ubuntu 用户
apt-get install msgpack-php
或者,可以在此处获取 github 源:[https ://github.com/msgpack/msgpack-php](https ://github.com/msgpack/msgpack-php)
2.配置:
1 2 3
| $phpize $configure --with-php-config=/path/to/php-config/ --enable-msgpack $make && make install
|
使用
查看源码
服务器端
设置 Yar HTTP RPC 服务器非常容易
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?php
namespace common\rpc;
class YarServer {
public function some_method($parameter, $option = "foo") { return $parameter; }
public function some_other_method1($parameter, $option = "foo") { return $parameter; }
public function some_other_method2($parameter, $option = "foo") { return $parameter; }
public function some_other_method3($parameter, $option = "foo") { return $parameter; }
protected function client_can_not_see() { } }
|
客户端
PHP 客户端调用远程 RPC 非常简单:
同步调用
1 2 3 4 5
| $client = new Yar_Client("http://self-api.shershon.top/index.php?c=yar&a=server"); $client->setOpt(YAR_OPT_CONNECT_TIMEOUT, 1000); $client->setOpt(YAR_OPT_HEADER, ["hd1: val", "hd2: val"]); var_dump($client->some_method("parameter"));
|
并发调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
\Yar_Concurrent_Client::call("http://self-api.shershon.top/index.php?c=yar&a=server", "some_method", ["parameters"]); \Yar_Concurrent_Client::call("http://self-api.shershon.top/index.php?c=yar&a=server", "some_other_method1", ["parameters"], 'callback'); \Yar_Concurrent_Client::call("http://self-api.shershon.top/index.php?c=yar&a=server", "some_other_method2", ["parameters"], 'callback', 'callError');
\Yar_Concurrent_Client::loop(['YarClient', 'loopCallback'], ['YarClient', 'loopError']); function callback($retval, $callinfo) { echo 'call自己的回调:' . $callinfo['method'] . ',方法返回数据' . $retval . PHP_EOL; }
function callError() { echo '发送rpc出错' . PHP_EOL; }
function loopCallback($retval, $callinfo) { if (is_null($callinfo)) { echo '所有rpc请求发送完毕调用' . PHP_EOL; } else { echo '调用成功后返回' . PHP_EOL; var_dump($retval); var_dump($callinfo); } }
function loopError() { echo '发送rpc出错' . PHP_EOL; }
|
持续通话
1 2 3 4 5 6 7
| $client = new Yar_Client("http://self-api.shershon.top/index.php?c=yar&a=server"); $client->SetOpt(YAR_OPT_PERSISTENT, 1); var_dump($client->some_method("parameter")); var_dump($client->some_other_method1("parameter")); var_dump($client->some_other_method2("parameter")); var_dump($client->some_other_method3("parameter"));
|