php使用Yar实现RPC调用

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 /include/curl/
需要安装apt-get install libcurl4-gnutls-dev

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

php服务端代码

handle();

php客户端代码

';
// yar打包工具
echo 'YAR_OPT_PACKAGER='.YAR_OPT_PACKAGER.'
'; // yar超时时间 echo 'YAR_OPT_TIMEOUT='.YAR_OPT_TIMEOUT.'
'; // yar连接超时时间 echo 'YAR_OPT_CONNECT_TIMEOUT='.YAR_OPT_CONNECT_TIMEOUT.'
'; echo "
"; /* 串行调用示例 */ // 创建一个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 "
"; var_dump($retval); echo "
"; var_dump($info); echo "
"; echo "
"; } function callback_error($type, $error, $info){ echo "
"; var_dump($type); echo "
"; var_dump($error); echo "
"; var_dump($info); echo "
"; echo "
"; } function callback_continue(){ echo '如果在loop中指定了callback,那么在所有并行请求发送完毕后,yar会调用一次此函数。而且,当call中没有指定具体的回调函数时,call执行完毕后会再次调用此函数。'; echo "
"; } // 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 服务

你可能感兴趣的:(php)