Yar轻量级、可串行也可并行、可通过get方法查看接口列表和注释,只需要把接口信息整理好,就能在查看接口的时候同时查看接口文档了。
轻量级、并行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
// 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
$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();
有一些细节需要注意: