Qu'est-ce que le framework RPC ?
Si RPC peut être résumé en une phrase : cadre d'appel à distance (Remote Procedure Call
)
Alors qu'est-ce que l'appel à distance ?
Habituellement, nous appelons une méthode en php, comme cette méthode de fonction : localAdd(10, 20). L'implémentation spécifique de la méthode localAdd est soit définie par l'utilisateur, soit il s'agit d'une fonction dans. la bibliothèque php. Avec, c'est à dire que le code de la méthode localAdd est implémenté localement, c'est un appel local ! L'appel à distance signifie : l'implémentation spécifique de la méthode appelée n'est pas là où le programme s'exécute, mais dans un autre endroit distant.
Principe de l'appel à distance
Par exemple, A (client) appelle la méthode remoteAdd fournie par B (serveur) :
Tout d'abord, établissez un connexion entre A et B Connexion TCP ;
Ensuite, A sérialise le nom de la méthode qui doit être appelée (remoteAdd ici) et les paramètres de la méthode (10, 20) dans un flux d'octets et l'envoie
B accepte ce que A envoie le flux d'octets, puis désérialise pour obtenir le nom de la méthode cible et les paramètres de la méthode, puis exécute l'appel de méthode correspondant (éventuellement localAdd) et renvoie le résultat 30 A accepte le résultat de l'appel à distance ; et sorties 30. Le framework RPC encapsule les détails que je viens de mentionner et expose les utilisateurs à une utilisation simple et conviviale de l'API.Avantages de l'appel à distance
Découplage : lorsque le serveur doit modifier la méthode, le client l'ignore complètement et n'a pas besoin d'effectuer de modifications ; méthode Elle est souvent utilisée lors de la collaboration entre départements et entreprises, et le fournisseur de la méthode est généralement appelé : exposition de service.Quelle est la différence entre RPC et Socket ?
Grâce à l'explication simple ci-dessus, il semble que RPC et Socket soient similaires. Ils appellent tous des méthodes distantes et sont tous des modèles client/serveur. J'ai également écrit un article auparavant : Parlons des sockets en détail. Quelle est la différence entre eux ?RPC (appel de procédure à distance) utilise le mode client/serveur. permet à deux processus de communiquer entre eux. Socket est l'une des méthodes de communication souvent utilisées par RPC. RPC est implémenté sur la base de Socket. Il nécessite plus de ressources réseau et système que Socket. En plus de Socket, RPC dispose également d'autres méthodes de communication, telles que : http, le propre pipeline du système d'exploitation et d'autres technologies pour implémenter des appels vers des programmes distants. Dans le système Windows de Microsoft, RPC utilise des canaux nommés pour la communication.Quelle est la différence entre RPC et REST ?
Après avoir compris RPC, nous savons que RPC est en mode client/serveur et appelle des méthodes distantes. REST est également un ensemble de méthodes de protocole d'appel d'API que nous connaissons, et sur lequel il est également basé. mode client/serveur , appelle la méthode distante, alors quelle est la différence entre eux ? L'API REST et RPC encapsulent toutes deux des fonctions dans des interfaces côté serveur et les exposent pour les appels clients. Cependant, l'API REST est basée sur le protocole HTTP et REST s'engage à transmettre POST/ dans le protocole http. . GET/PUT/DELETE et d'autres méthodes et une URL lisible par l'homme pour fournir une requête http. Et RPC n'a pas besoin d'être basé sur le protocole HTTPPar conséquent, si les deux langages back-end s'appellent, l'utilisation de RPC peut obtenir de meilleures performances (en éliminant une série de des éléments tels que les en-têtes HTTP) ), devraient également être plus faciles à configurer. Si le front-end appelle le back-end via AJAX, il est préférable d'utiliser l'API REST (car de toute façon, vous ne pouvez pas éviter l'obstacle HTTP).Quels sont les frameworks RPC populaires en php ?
Puisque PHP est le meilleur langage au monde, quels sont les frameworks RPC populaires en php ? Listons-les d'abord :, phprpc
, yar
, thrift
, gRPC
, swoole
hprose
phprpc
Téléchargez d'abord la dernière version stable de phprpc depuis le site officiel : lien de téléchargement et décompressez.Installation
Nous constaterons qu'il y a de nombreux fichiers et dossiers à l'intérieur, avec la structure suivante :dhparams/ pecl/ bigint.php compat.php phprpc_date.php xxtea.php dhparams.php phprpc_server.php phprpc_client.php
[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
[root@localhost /]# vi /usr/local/php/etc/php.ini [xxtea] extension=xxtea.so
[root@localhost /]# /usr/local/apache/bin/apachectl restart
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().....
google了下,说是先把 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教程!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!