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();
有一些细节需要注意:
- 如果在loop中指定了默认回调函数,那么在所有并行请求发送完毕后,yar会调用一次此回调。如loop1
- 当call中没有指定回调,loop中也没有指定回调的时候,不执行任何回调,只返回结果。如call1+loop2
- 当call中没有指定回调,loop指定默认回调的时候,此时call默认将loop中指定的回调作为默认回调。如call1+loop1,会执行两次回调
- 并行中可独立为客户端指定配置,用array传入配置参数
1806

被折叠的 条评论
为什么被折叠?



