甚么是RPC框架?
假如用一句话归纳综合RPC就是:近程挪用框架(Remote Procedure Call
)
那甚么是近程挪用?
通常咱们挪用一个php中的办法,比方这样一个函数办法: localAdd(10, 20),localAdd办法的详细完成要末是用户本人界说的,要末是php库函数中自带的,也就说正在localAdd办法的代码完成正在内陆,它是一个内陆挪用!近程挪用意义就是:被挪用办法的详细完成没有正在顺序运转内陆,而是正在此外某个近程中央。
近程挪用原理
比方 A (client) 挪用 B (server) 提供的remoteAdd办法:
起首A与B之间建设一个TCP衔接;
而后A把需求挪用的办法名(这里是remoteAdd)和办法参数(10, 20)序列化成字节省发送进来;
B承受A发送过去的字节省,而后反序列化失去指标办法名,办法参数,接着执行相应的办法挪用(多是localAdd)并把后果30前往;
A承受近程挪用后果,输入30。
RPC框架就是把我方才说的这几点些细节给封装起来,给用户暴露简略敌对的API应用。
近程挪用的益处
解耦:当server需求对办法内完成修正时,client齐全感知没有到,不必做任何变卦;这类形式正在跨部门,跨公司协作的时分常常用到,而且办法的提供者咱们通常称为:效劳的暴露。
RPC与Socket有甚么区分?
经过下面的简略论述,如同RPC与Socket 如同啊。都是挪用近程的办法,都是client/server模式,我以前也写了一篇文章: 细说socket 那他们有啥区分呢?
RPC(近程进程挪用)采纳客户机/效劳器模式完成两个过程之间互相通讯。socket是RPC常常采纳的通讯手法之一,RPC是正在Socket的根底上完成的,它比socket需求更多的网络以及零碎资本。除了了Socket,RPC另有其余的通讯办法,比方:http、操作零碎自带的管道等技巧来完成关于近程顺序的挪用。微软的Windows零碎中,RPC就是采纳定名管道进行通讯。
RPC与REST有甚么区分?
经过理解RPC后,咱们晓得是RPC是client/server模式的,挪用近程的办法,REST也是咱们相熟的一套API挪用协定办法,它也是基于client/server模式的,挪用近程的办法的,那他俩又有啥区分呢?
REST API 以及 RPC 都是正在 Server端 把一个个函数封装成接口暴显露去,以供 Client端 挪用,不外 REST API 是基于HTTP协定的,REST努力于经过http协定中的POST/GET/PUT/DELETE等办法以及一个可读性强的URL来提供一个http申请。
而 RPC 则能够没有基于 HTTP协定
因而,假如是后端两种言语相互挪用,用 RPC 能够取得更好的功能(省去了 HTTP 报头号一系列货色),应该也更易设置装备摆设。
假如是前端经过 AJAX 挪用后端,那末用 REST API 的方式比拟好(由于无论若何也避没有开 HTTP 这道坎)。
php中盛行的rpc框架有哪些
既然php是世界上最佳的言语,那php中盛行的RPC框架有哪些呢?
先罗列下: phprpc
,yar
, thrift
, gRPC
, swoole
, hprose
由于工夫以及精力无限,不成能一个一个的去学习以及应用,我选几个世面上用的最多的几个用下吧。由于RPC原理是同样的,都是Client/Server模式,只是每一个框架的应用形式纷歧样罢了。
次要解说一下 phprpc 以及 yar 是我今朝据说以及接触最多的了。
phprpc
先从官网下载最新稳固版的phprpc:下载链接 解压。
装置
咱们会发现外面有不少文件以及文件夹,构造以下:
dhparams/ pecl/ bigint.php compat.php phprpc_date.php xxtea.php dhparams.php phprpc_server.php phprpc_client.php
此中有dhparams以及pecl是文件夹,pecl中的是php的xxtea扩大,依照官网的形容,能够装置也能够没有装置,没有装置phprpc也是能够运转的。然而假如你需求更快的加密解决才能,能够装置下。
我仍是装置吧。究竟结果加密才能更快,是坏事:
装置步骤以下,先将pecl下的xxtea文件夹复制到php源码的etx目次:/lamp/php-5.4.11/ext下。而后用phpize进行扩大从新编译。
[root@localhost /]# cd /lamp/php-5.4.11/ext/xxtea [root@localhost xxtea]# /usr/local/php/bin/phpize [root@localhost xxtea]# ./configure --enable-xxtea=shared --with-php-config=/usr/local/php/bin/php-config make && make install
OK ,编译实现,提醒咱们xxtea.so曾经正在/usr/local/php/lib/php/extensions/no-debug-zts-20100525/xxtea.so 下了。
上面,咱们就需求正在php.ini的最初将这个xxtea.so加之:
[root@localhost /]# vi /usr/local/php/etc/php.ini [xxtea] extension=xxtea.so
加好了后,咱们需求重启下apache或许php-fpm
重启apache
[root@localhost /]# /usr/local/apache/bin/apachectl restart
滑润圆滑重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
重启终了后,关上phpinfo()页面,搜寻一下,应该就可以看到xxtea了。
开端应用
先来个简略的例子,phprpc也是分为效劳器端以及客户真个。以是文件夹中对应的就是phprpc_server.php
以及 phprpc_client.php
咱们参考官网的几个例子,操练下:
server.php 效劳端:这样写就实现了一个最简略的helloword的接口。
<?php include ("phprpc/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start();
运转下server.php,我擦,竟然报错了!!!
PHP Strict Standards: Non-static method PHPRPC_Server::initSession().... Cannot redeclare gzdecode().....
谷歌了下,说是先把 phprpc_server.php的413行的initSession()改为static function
static function initSession() { **** }
我了个擦,这么年夜的谬误,phprpc是怎样公布的!!!
正在把compat.php 的第 71行的 gzdecode()函数,php5.4曾经完成了这个函数了。这样函数就被重写了,就报错了,以是加个判别:
if (!function_exists('gzdecode')) { //将gzdecode函数包罗出去 }
好。改完,保留。再运转下server.php 。ok 了。没有报错了。输入:
phprpc_functions="YToxOntpOjA7czo5OiJoZWxsb3dvcmQiO30=";
咱们接上去写客户端 client.php, 看是若何写的?
<?php include ("phprpc/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?>
咱们正在执行如下client.php,如愿以偿的输入了:
Hello Word!
这样一个简略的Server/Clent交付就搞定了。尽管两头出了点过错,然而总体来讲仍是蛮简略易懂的!
其余的更初级的用法能够参考官网的。
yar
yar 是国际驰名的php年夜神鸟哥惠新宸的高文,正在微博产物中曾经开端应用。它也是一款rpc框架。它因为应用纯C编写的用于php的扩大,以是,效率应该是蛮高的,并且支持异步并行,这点仍是赞的。
下载装置
官网下载:http://pecl.php.net/package/yar 最新的版本 yar-1.2.4.tgz
而后解压复制到php源码的etx目次:/lamp/php-5.4.11/ext下。而后用phpize进行扩大从新编译。
[root@localhost yar-1.2.4]# /usr/local/php/bin/phpize [root@localhost yar-1.2.4]# ./configure --with-php-config=/usr/local/php/bin/php-config
然而呈现了点成绩:提醒,curl 有成绩:
configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
预计是我本机curl 有成绩,那用yum 装置一下吧:
yum -y install curl-devel
装置实现curl 后持续编译装置,就没啥成绩了:
[root@localhost yar-1.2.4]# /usr/local/php/bin/phpize [root@localhost yar-1.2.4]# ./configure --with-php-config=/usr/local/php/bin/php-config [root@localhost yar-1.2.4]# make && make install
胜利之后,提醒咱们 yar.so 扩大正在曾经正在/usr/local/php/lib/php/extensions/no-debug-zts-20100525/ 下了。
咱们vi编纂一下 php.ini ,最初面加之yar.so扩大,而后重启一下 apache 或许php-pfm就能够了。
[root@localhost /]# vi /usr/local/php/etc/php.ini [yar] extension=yar.so
好。加好了后,咱们需求重启下apache或许php-fpm
重启apache
[root@localhost /]# /usr/local/apache/bin/apachectl restart
滑润圆滑重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
重启终了后,关上phpinfo()页面,搜寻一下,应该就可以看到yar了。
开端应用
以及其余的rpc框架同样,yar也是server/client模式,以是,咱们也同样,开端写一个简略的例子来讲下若何挪用。
yar_server.php示意效劳器端
<?php class API { public function api($parameter, $option = "foo") { return $parameter; } protected function client_can_not_see() { } } $service = new Yar_Server(new API()); $service->handle();
好,咱们正在阅读器里运转一下,就会呈现以下图所示的输入。很高端啊!!!鸟哥说这样做的用处是能够了如指掌的晓得我这个rpc提供了几何接口,把api文档均可以省略了。
好,咱们开端写yar_client.php 这个是客户端:
$client = new Yar_Client("http://127.0.0.1/yar_server.php"); echo $client->api('helo word');
像其余的 swoole,hprose等根本都是这个原理,只是看谁的性能愈加,用起来更随手而已。
更多相干php常识,请拜访php教程!
以上就是盛行的php rpc框架详解的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!