当前位置: 首页 > 工具软件 > Yar > 使用案例 >

php使用Yar实现RPC调用

商瀚
2023-12-01

Yar轻量级、可串行也可并行、可通过get方法查看接口列表和注释,只需要把接口信息整理好,就能在查看接口的时候同时查看接口文档了。

Yar是啥

轻量级、并行php RPC框架,只支持php程序之间的相互调用。
优点:轻量级、可串行也可并行、可通过get方法查看接口列表和注释,只需要把接口信息整理好,就能在查看接口的时候同时查看接口文档了。
缺点:不支持跨语言调用。

安装

git clone https://github.com/laruence/yar.git
phpize
./configure
make & make install

// 安装成功后,在php.ini中添加extension=yar.so,重启fpm即可

./configure报错
configure: error: Please reinstall the libcurl distribution - easy.h in <curl-dir>/include/curl/
需要安装apt-get install libcurl4-gnutls-dev

yar支持php、json和Msgpack三种打包工具,默认是php,如果要用Msgpack的话要先安装Msgpack扩展,然后配置时加上--enable-msgpack参数。但实际使用中发现,php的serialize和msgpack的效率几乎差不太多,甚至serialize性能还要好一点点,不过serialize所占的空间要稍大一些,个人认为没有必要用msgpack。

php服务端代码

<?php       
// this is a yar server
Class Api{
    /**  
     * this is a comments
     * api documents writes here
     */  
    function add($a,$b){
       return $a+$b;                                                                                                                                                                        
    }       
            
    function mult($a,$b){
       return $a*$b;
    }       
            
    protected function _add(){
       return 'this can\'t be seen by client';
    }       
}           
            
$server = new Yar_Server(new Api());
$server->handle();

php客户端代码

<?php
$server_url = 'http://www.ruisicake.com/server.php';

// yar版本
echo 'YAR_VERSION='.YAR_VERSION.'<br>';
// yar打包工具
echo 'YAR_OPT_PACKAGER='.YAR_OPT_PACKAGER.'<br>';
// yar超时时间
echo 'YAR_OPT_TIMEOUT='.YAR_OPT_TIMEOUT.'<br>';
// yar连接超时时间
echo 'YAR_OPT_CONNECT_TIMEOUT='.YAR_OPT_CONNECT_TIMEOUT.'<br>';
echo "<br>";

/* 串行调用示例 */
// 创建一个yar客户端
$client = new Yar_Client($server_url);

// $client->SetOpt(YAR_OPT_CONNECT_TIMEOUT,2000);
// $client->SetOpt(YAR_OPT_PACKAGER,YAR_PACKAGER_PHP);

// 调用服务端接口
var_dump($client->add(1,2));
var_dump($client->mult(1,2));

var_dump($client->_add());
// 因为服务端_add函数是protected所以会报错:
`Fatal error: Yar_Client::__call(): unsupported packager msgpack in /usr/share/nginx/html/cake/client.php on line 9`
        
        
        
/* 并行调用示例 */     
function callback_success($retval,$info){
    echo "<br>";
    var_dump($retval);                                                                                                                                                                       
    echo "<br>";
    var_dump($info);
    echo "<br>";
    echo "<br>";
}       
        
function callback_error($type, $error, $info){
    echo "<br>";
    var_dump($type);
    echo "<br>";
    var_dump($error);
    echo "<br>";
    var_dump($info);
    echo "<br>";
    echo "<br>";
}       

function callback_continue(){
    echo '如果在loop中指定了callback,那么在所有并行请求发送完毕后,yar会调用一次此函数。而且,当call中没有指定具体的回调函数时,call执行完毕后会再次调用此函数。';
    echo "<br>";
}   
 
// call1
Yar_Concurrent_Client::call($server_url,'add',array(10,10));  
// call2
Yar_Concurrent_Client::call($server_url,'mult',array(10,10),'callback_success');
// call3
Yar_Concurrent_Client::call($server_url,'_add',array(1,3),'callback_success','callback_error',array(YAR_OPT_PACKAGER=>'php'));
// call4
Yar_Concurrent_Client::call($server_url,'_add',array(1,4),'callback_success','callback_error');

// loop1
Yar_Concurrent_Client::loop('callback_continue','callback_error');
// loop2
// Yar_Concurrent_Client::loop(); 

有一些细节需要注意:

  1. 如果在loop中指定了默认回调函数,那么在所有并行请求发送完毕后,yar会调用一次此回调。如loop1
  2. 当call中没有指定回调,loop中也没有指定回调的时候,不执行任何回调,只返回结果。如call1+loop2
  3. 当call中没有指定回调,loop指定默认回调的时候,此时call默认将loop中指定的回调作为默认回调。如call1+loop1,会执行两次回调
  4. 并行中可独立为客户端指定配置,用array传入配置参数

官方文档--phpWeb 服务


 

linux下安装php的yar远程RPC扩展并使用,php yar安装

 类似资料: