Qu'est-ce que le framework RPC ? Si RPC peut être résumé en une phrase : Appel de procédure à distance, 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 fournie avec la fonction de la bibliothèque PHP, c'est-à-dire dans la méthode localAdd. le code 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.
Par exemple, A (client) appelle la méthode remoteAdd fournie par B (serveur) :
Tout d'abord, établissez un lien entre la connexion TCP A et B ;
Ensuite, A sérialise le nom de la méthode à appeler (remoteAdd ici) et les paramètres de la méthode (10, 20) dans un flux d'octets et l'envoie ;
B accepte le flux d'octets envoyé par A, puis le 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 en sort 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.
Découplage : lorsque le serveur doit modifier la méthode, le client l'ignore complètement et n'a pas besoin d'apporter de modifications, cette méthode convient aux services interservices et ; coopération inter-entreprises Elle est souvent utilisée, et le fournisseur de la méthode est généralement appelé : exposition de service.
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 en mode client/serveur. J'ai aussi écrit un article auparavant : Parlons des sockets en détail Alors quelles sont les différences entre eux ?
RPC (appel de procédure distante) utilise le client. Le mode /server 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, qui 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.
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. Il est également basé sur le mode client/serveur. et appelle la méthode distante, alors quelle est la différence entre elles ?
L'API REST et RPC encapsulent toutes deux des fonctions dans des interfaces côté serveur et les exposent aux appels du client. Cependant, l'API REST est basée sur le protocole HTTP et REST s'engage à transmettre le POST/GET. /PUT/DELETE et d'autres méthodes et une URL lisible par l'homme pour fournir une requête http. RPC n'a pas besoin d'être basé sur le protocole HTTP
Par 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 choses telles que les en-têtes HTTP), et cela devrait être plus facile à 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).
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
En raison du temps et de l'énergie limités, il est impossible de les apprendre et de les utiliser un par un. Je vais les choisir. quelques-uns qui sont couramment utilisés dans le monde. Utilisons ceux qui en ont le plus. Parce que le principe de RPC est le même, les deux sont en mode Client/Serveur, mais la manière d'utiliser chaque framework est différente.
Expliquez principalement phprpc et yar, dont j'ai entendu parler et avec lesquels j'ai le plus été en contact jusqu'à présent.
Téléchargez d'abord la dernière version stable de phprpc depuis le site officiel : Lien de téléchargement Décompressez.
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
Parmi eux, dhparams et pecl sont des dossiers, et celui de pecl est l'extension xxtea de php, comme décrit sur le site officiel, vous pouvez l'installer ou non, et vous pouvez exécuter phprpc sans l'installer. Mais si vous avez besoin de capacités de traitement de chiffrement plus rapides, vous pouvez l'installer.
Je ferais mieux de l’installer. Après tout, un cryptage plus rapide est une bonne chose :
Les étapes d'installation sont les suivantes : copiez d'abord le dossier xxtea sous pecl dans le répertoire etx du code source php : /lamp/php-5.4.11/ext. . Utilisez ensuite phpize pour recompiler avec les extensions.
[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, la compilation est terminée, nous indiquant que xxtea.so est déjà dans /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xxtea.so.
Ensuite, nous devons ajouter ce xxtea.so à la fin du php.ini :
[root@localhost /]# vi /usr/local/php/etc/php.ini [xxtea] extension=xxtea.so
D'accord. Après l'avoir ajouté, nous devons redémarrer Apache ou php-fpm
重启apache [root@localhost /]# /usr/local/apache/bin/apachectl restart 平滑重启php-fpm kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
Une fois le redémarrage terminé, ouvrez la page phpinfo() et recherchez, vous devriez pouvoir voir xxtea.
Prenons d'abord un exemple simple. phprpc est également divisé en serveur et client. Ainsi, ceux correspondants dans le dossier sont phprpc_server.php et phprpc_client.php
Référons-nous à plusieurs exemples sur le site officiel et pratiquons :
server.php Server : écrire de cette façon complétera un interface finale simple helloword.
<?php include ("phprpc/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start();
Exécutez server.php, je l'ai effacé et une erreur a été signalée ! ! !
PHP Strict Standards: Non-static method PHPRPC_Server::initSession().... Cannot redeclare gzdecode().....
Je l'ai cherché sur Google et il a dit que j'avais d'abord changé le initSession() sur la ligne 413 de phprpc_server.php en une fonction statique
static function initSession() { **** }
PS J'étais confus, c'est. donc grosse erreur, comment est publié phprpc ! ! !
Dans la fonction gzdecode() à la ligne 71 de compat.php, php5.4 a déjà implémenté cette fonction. De cette façon, la fonction est réécrite et une erreur est signalée, alors ajoutez un jugement :
if (!function_exists('gzdecode')) { //将gzdecode函数包括进来 }
D'accord. Après avoir apporté des modifications, enregistrez. Exécutez à nouveau server.php. D'ACCORD. Plus d'erreurs. Résultat :
phprpc_functions="YToxOntpOjA7czo5OiJoZWxsb3dvcmQiO30=";
Écrivons ensuite le client client.php. Voyons comment il est écrit ?
<?php include ("phprpc/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?>
Nous exécutons le client.php suivant, et le résultat est comme prévu :
Hello Word!
Une livraison serveur/client aussi simple est effectuée. Bien qu'il y ait eu quelques erreurs au milieu, c'est généralement assez simple et facile à comprendre
Pour d'autres utilisations plus avancées, veuillez vous référer au site officiel !
yar est le chef-d'œuvre de Hui Xinchen, le célèbre maître PHP en Chine, et a été utilisé dans les produits Weibo. C'est aussi un framework rpc. Parce qu'il utilise une extension pour PHP écrite en C pur, l'efficacité devrait être assez élevée et il prend en charge le parallélisme asynchrone, ce qui est plutôt bon.
Téléchargement du site officiel : http://pecl.php.net/package/yar La dernière version yar-1.2.4.tgz
Puis décompressez et copiez dans le répertoire etx le code source php : /lamp/php-5.4.11/ext. Utilisez ensuite phpize pour recompiler avec les extensions.
[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
Mais il y a un problème : invite, il y a un problème avec curl :
configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
Je suppose qu'il y a un problème avec curl sur ma machine locale, alors utilisez yum pour installez-le :
yum -y install curl-devel
Après avoir installé curl, continuez à compiler et à installer, et il n'y aura aucun problème :
[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
Après succès, nous serons invités à indiquer que yar.so l'extension est déjà dans /usr/local/php/lib/php /extensions/no-debug-zts-20100525/ est en panne.
Nous modifions php.ini, ajoutons l'extension yar.so à la fin, puis redémarrons Apache ou php-pfm.
[root@localhost /]# vi /usr/local/php/etc/php.ini [yar] extension=yar.so
D'accord. Après l'avoir ajouté, nous devons redémarrer Apache ou php-fpm
重启apache [root@localhost /]# /usr/local/apache/bin/apachectl restart 平滑重启php-fpm kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
Une fois le redémarrage terminé, ouvrez la page phpinfo(), recherchez et vous devriez pouvoir voir yar.
Comme les autres frameworks rpc, yar est également un modèle serveur/client, nous allons donc faire de même et commencer à écrire un exemple simple pour montrer comment l'appeler.
yar_server.php représente le côté serveur
<?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();
D'accord, exécutons-le dans le navigateur et la sortie comme indiqué ci-dessous apparaîtra. Très haut de gamme ! ! ! Frère Niao a dit que le but de ceci est de savoir en un coup d'œil combien d'interfaces mon rpc fournit, et la documentation de l'API peut être omise.
D'accord, commençons à écrire yar_client.php Voici le client :
$client = new Yar_Client("http://127.0.0.1/yar_server.php"); echo $client->api('helo word');
D'accord, c'est essentiellement ce que font les autres swoole, hprose, etc. Le principe est simplement de voir lequel a le plus de fonctions et est le plus facile à utiliser.
Recommandations associées :
Le framework RPC en PHP implémente un système de contrôle de flux basé sur Redis
Exemples détaillés de framework RPC
Explication détaillée du code des appels à distance PHP et du framework RPC (photo)
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!