ホームページ  >  記事  >  バックエンド開発  >  人気のphp・rpcフレームワークを詳しく解説

人気のphp・rpcフレームワークを詳しく解説

藏色散人
藏色散人転載
2020-01-23 22:08:313127ブラウズ

人気のphp・rpcフレームワークを詳しく解説

RPC フレームワークとは何ですか?

RPC を一文で要約すると: リモート呼び出しフレームワーク (リモート プロシージャ コール )

では、リモート呼び出しとは何でしょうか。

通常、php では、localAdd(10, 20) のような関数メソッドなどのメソッドを呼び出します。localAdd メソッドの具体的な実装は、ユーザーによって定義されるか、 PHP ライブラリの関数、つまり、localAdd メソッドのコードがローカルに実装されている場合、これはローカル呼び出しです。リモート呼び出しとは、呼び出されるメソッドの特定の実装が、プログラムが実行されている場所ではなく、他のリモートの場所にあることを意味します。

リモート呼び出しの原則

たとえば、A (クライアント) は、B (サーバー) が提供する RemoteAdd メソッドを呼び出します。

まず、接続を確立します。 A と B 間の TCP 接続;

次に、A は呼び出す必要があるメソッド名 (ここではremoteAdd) とメソッド パラメータ (10、20) をバイト ストリームにシリアル化し、送信します。

B は A が送信したものを受け入れます 次に、バイト ストリームが逆シリアル化されてターゲット メソッド名とメソッド パラメータが取得され、対応するメソッド呼び出し (おそらく localAdd) が実行され、結果 30 が返されます。リモート呼び出しの結果と出力 30。

RPC フレームワークは、先ほど述べた詳細をカプセル化し、ユーザーにシンプルでフレンドリーな API の使用を提供します。

リモート呼び出しの利点

分離: サーバーがメソッドを変更する必要がある場合、クライアントはそれをまったく認識せず、変更を加える必要がありません。メソッド 部門や会社を越えてコラボレーションする場合によく使用され、メソッドの提供者は通常「サービス公開」と呼ばれます。

RPC とソケットの違いは何ですか?

上記の簡単な説明から、RPC と Socket は似ていることがわかります。これらはすべてリモート メソッドを呼び出し、すべてクライアント/サーバー モードです。以前にも記事を書きました: ソケットについて詳しく話しましょう。それらの違いは何ですか?

RPC (リモート プロシージャ コール) はクライアント/サーバーを使用しますこのモードでは、2 つのプロセスが相互に通信できるようになります。ソケットは RPC でよく使用される通信方式の 1 つであり、RPC はソケットに基づいて実装されているため、ソケットよりも多くのネットワーク リソースとシステム リソースが必要になります。 RPC には、Socket に加えて、http、オペレーティング システム独自のパイプライン、およびリモート プログラムへの呼び出しを実装するその他のテクノロジなど、他の通信方法もあります。 Microsoft の Windows システムでは、RPC は通信に名前付きパイプを使用します。

RPC と REST の違いは何ですか?

RPC を理解すると、RPC がクライアント/サーバー モードであり、リモート メソッドを呼び出すことがわかります。REST も、私たちがよく知っている API 呼び出しプロトコル メソッドのセットです。また、クライアントに基づいています。 /server mode. はリモートメソッドを呼び出しますが、両者の違いは何でしょうか?

REST API と RPC は両方とも、関数をサーバー側のインターフェイスにカプセル化し、クライアント呼び出し用に公開します。ただし、REST API は HTTP プロトコルに基づいています。REST は http プロトコルで POST/ を渡すことに専念しています。 GET/PUT/DELETE などのメソッドと人間が判読できる URL を使用して http リクエストを提供します。

そして、RPC は HTTP プロトコルに基づく必要はありません

したがって、2 つのバックエンド言語が相互に呼び出しを行う場合、RPC を使用するとパフォーマンスが向上します (一連のHTTP ヘッダーなど) ) の設定も簡単になるはずです。

フロントエンドが AJAX 経由でバックエンドを呼び出す場合は、REST API を使用することをお勧めします (HTTP のハードルは避けられないため)。

php で人気のある RPC フレームワークは何ですか

php は世界で最高の言語なので、php で人気のある RPC フレームワークは何ですか?

最初に列挙しましょう:

phprpc

yarthriftgRPCswoolehprose時間とエネルギーには限りがあるため、1 つずつ学習して使用することは不可能です。世界で最も一般的に使用されているものをいくつか選択します。 RPC の原理は同じなので、どちらもクライアント/サーバー モードですが、それぞれのフレームワークの使用方法が異なります。

私が今まで一番聞いたことも触れることも多いphprpcとyarを中心に説明します。

phprpc

まず、公式 Web サイトから 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 にダウンロードされたことが表示されます。

次に、この xxtea.so を php.ini の最後に追加する必要があります:

[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.phpphprpc_client.php

我们参考官网的几个例子,练习下:

server.php 服务端:这样写就完成了一个最简单的helloword的接口。

<?php
include ("phprpc/phprpc_server.php");
function HelloWorld() {
   return &#39;Hello World!&#39;;
}
$server = new PHPRPC_Server();
$server->add(&#39;HelloWorld&#39;);
$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(&#39;gzdecode&#39;)) {
    //将gzdecode函数包括进来
}

好。改完,保存。再运行下server.php 。ok 了。不报错了。输出:

phprpc_functions="YToxOntpOjA7czo5OiJoZWxsb3dvcmQiO30=";

我们接下来写客户端 client.php, 看是如何写的?

<?php
include ("phprpc/phprpc_client.php");
$client = new PHPRPC_Client(&#39;http://127.0.0.1/server.php&#39;);
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(&#39;helo word&#39;);

像其他的 swoole,hprose等基本都是这个原理,只是看谁的功能更加,用起来更顺手罢了。

更多相关php知识,请访问php教程

以上が人気のphp・rpcフレームワークを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。