Heim > Artikel > Backend-Entwicklung > Detaillierte Erklärung des beliebten PHP-RPC-Frameworks
Was ist das RPC-Framework?
Wenn RPC in einem Satz zusammengefasst werden kann: Remote Call Framework (Remote Procedure Call
)
Was ist dann Remote Call?
Normalerweise rufen wir eine Methode in PHP auf, wie zum Beispiel diese Funktionsmethode: localAdd(10, 20) Die spezifische Implementierung der localAdd-Methode wird entweder vom Benutzer definiert oder es ist eine Funktion in Das heißt, der Code in der localAdd-Methode wird lokal implementiert und ist ein lokaler Aufruf! Remote-Aufruf bedeutet: Die spezifische Implementierung der aufgerufenen Methode befindet sich nicht dort, wo das Programm ausgeführt wird, sondern an einem anderen entfernten Ort.
Prinzip des Remote-Aufrufs
Zum Beispiel ruft A (Client) die von B (Server) bereitgestellte remoteAdd-Methode auf:
Erstellen Sie zunächst a Verbindung zwischen A und B TCP-Verbindung;
Dann serialisiert A den Methodennamen, der aufgerufen werden muss (remoteAdd hier) und die Methodenparameter (10, 20) in einen Byte-Stream und sendet ihn aus; 🎜>B akzeptiert den Byte-Stream, den A sendet, deserialisiert dann, um den Zielmethodennamen und die Methodenparameter zu erhalten, führt dann den entsprechenden Methodenaufruf aus (möglicherweise localAdd) und gibt das Ergebnis zurück 30;
A akzeptiert das Ergebnis des Remote-Aufrufs und gibt 30 aus.
Das RPC-Framework kapselt die Details, die ich gerade erwähnt habe, und bietet Benutzern eine einfache und benutzerfreundliche API-Nutzung.
Vorteile von Remote-AufrufenEntkopplung: Wenn der Server die Methode ändern muss, ist sich der Client dessen überhaupt nicht bewusst und muss keine Änderungen vornehmen; Methode Wird häufig bei der abteilungs- und unternehmensübergreifenden Zusammenarbeit verwendet, und der Anbieter der Methode wird üblicherweise als Service Exposure bezeichnet.
Was ist der Unterschied zwischen RPC und Socket?Durch die obige einfache Erklärung scheint es, dass RPC und Socket ähnlich sind. Sie alle rufen Remote-Methoden auf und sind im Client/Server-Modus. Ich habe zuvor auch einen Artikel geschrieben: Was sind die Unterschiede zwischen ihnen?
RPC (Remote Procedure Call) verwendet Client/Server Der Modus ermöglicht es zwei Prozessen, miteinander zu kommunizieren. Socket ist eine der von RPC häufig verwendeten Kommunikationsmethoden. RPC basiert auf Socket. Es erfordert mehr Netzwerk- und Systemressourcen als Socket. Neben Socket verfügt RPC auch über andere Kommunikationsmethoden wie http, die eigene Pipeline des Betriebssystems und andere Technologien zur Implementierung von Aufrufen an Remote-Programme. Im Windows-System von Microsoft verwendet RPC benannte Pipes für die Kommunikation.
Was ist der Unterschied zwischen RPC und REST?Nachdem wir RPC verstanden haben, wissen wir, dass sich RPC im Client/Server-Modus befindet und Remote-Methoden aufruft. REST ist ebenfalls eine Reihe von API-Aufrufprotokollmethoden, mit denen wir vertraut sind und auf denen es auch basiert Client/Server-Modus, ruft die Remote-Methode auf, was ist also der Unterschied zwischen ihnen?
REST-API und RPC kapseln beide Funktionen in Schnittstellen auf der Serverseite und machen sie für Client-Aufrufe verfügbar. Die REST-API basiert jedoch auf dem HTTP-Protokoll und REST ist auf die Übergabe von POST/ im http-Protokoll festgelegt . GET/PUT/DELETE und andere Methoden sowie eine für Menschen lesbare URL zur Bereitstellung einer http-Anfrage.
Und RPC muss nicht auf dem HTTP-Protokoll basieren
Wenn sich die beiden Back-End-Sprachen gegenseitig aufrufen, kann die Verwendung von RPC daher eine bessere Leistung erzielen (wodurch eine Reihe von Fehlern eliminiert werden). Dinge wie HTTP-Header) sollten ebenfalls einfacher zu konfigurieren sein.
Wenn das Frontend das Backend über AJAX aufruft, ist es besser, die REST-API zu verwenden (da Sie die HTTP-Hürde ohnehin nicht umgehen können).
Was sind die beliebtesten RPC-Frameworks in PHP?Da PHP die beste Sprache der Welt ist, was sind die beliebtesten RPC-Frameworks in PHP?
Lassen Sie uns sie zuerst auflisten:
,, phprpc
, yar
, thrift
, gRPC
swoole
hprose
Aufgrund der begrenzten Zeit und Energie ist dies unmöglich Um sie einzeln aufzulisten, werde ich einige der am häufigsten verwendeten auf der Welt auswählen. Da das RPC-Prinzip dasselbe ist, handelt es sich bei beiden um den Client/Server-Modus, die Verwendung jedes Frameworks ist jedoch unterschiedlich.
Erkläre hauptsächlich PHPrPC und Yar, von denen ich bisher gehört habe und mit denen ich am häufigsten in Berührung gekommen bin.
phprpcLaden Sie zunächst die neueste stabile Version von phprpc von der offiziellen Website herunter: Download-Link und entpacken.
InstallationWir werden feststellen, dass sich darin viele Dateien und Ordner mit der folgenden Struktur befinden:
dhparams/ pecl/ bigint.php compat.php phprpc_date.php xxtea.php dhparams.php phprpc_server.php phprpc_client.php
Da sind dhparams und pecl ein Ordner, und was sich in pecl befindet, ist die xxtea-Erweiterung von PHP, die installiert werden kann oder nicht. Es kann auch ohne die Installation von phprpc ausgeführt werden. Wenn Sie jedoch schnellere Verschlüsselungsverarbeitungsfunktionen benötigen, können Sie diese installieren.
Ich sollte es besser installieren. Schließlich ist eine schnellere Verschlüsselung eine gute Sache:
Die Installationsschritte sind wie folgt. Kopieren Sie zunächst den xxtea-Ordner unter pecl in das etx-Verzeichnis des PHP-Quellcodes: /lamp/php-5.4.11/ext . Verwenden Sie dann phpize, um mit Erweiterungen neu zu kompilieren.
[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, die Kompilierung ist abgeschlossen und zeigt uns an, dass xxtea.so in /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xxtea.so heruntergeladen wurde.
Als nächstes müssen wir dieses xxtea.so am Ende von php.ini hinzufügen:
[root@localhost /]# vi /usr/local/php/etc/php.ini [xxtea] extension=xxtea.so
Nachdem wir es hinzugefügt haben, müssen wir Apache oder php-fpm neu starten
Apache neu starten
[root@localhost /]# /usr/local/apache/bin/apachectl restart
php-fpm reibungslos neu starten
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教程!
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des beliebten PHP-RPC-Frameworks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!