近年、ネットワーク アプリケーションの継続的な開発に伴い、リモート プロシージャ コール (RPC) の機能を実装する必要があるアプリケーションが増えています。 Dubbo、Thrift、gRPC などの従来の RPC フレームワークはこの需要を満たすことができますが、アプリケーションとビジネスの増加に伴い、パフォーマンスの問題がますます明らかになってきています。これらの問題を解決するために、オープン ソース コミュニティは、PHP 言語 Swoole に基づく高性能 RPC サーバーを立ち上げました。
Swoole は、PHP 言語に基づいて開発された非同期、並列の高性能ネットワーク通信フレームワークで、PHP プログラムがネットワーク要求をより効率的に処理できるようにします。 RPC サーバーは Swoole のコンポーネントであり、TCP プロトコルに基づいたリモート プロシージャ呼び出しメソッドを提供し、非同期 I/O、コルーチン、プロセス管理などの機能をサポートし、高性能、高同時実行性の RPC サービスを簡単に実装できます。
次に、Swooleを使って高性能なRPCサーバーを実装する方法を紹介します。
始める前に、まず Swoole 拡張機能をインストールする必要があります。 Swoole は PHP の基礎となる C 拡張機能に依存しているため、最初に C コンパイラーと Swoole の依存ライブラリをインストールする必要があります。
yum install -y gcc automake autoconf libtool make php-devel php-pear pcre-devel openssl-devel
依存ライブラリをインストールした後、pecl コマンドを使用して Swoole 拡張機能をインストールできます:
pecl install swoole
インストールが完了したら、php.ini に次の行を追加する必要があります。 Swoole 拡張機能を有効にするファイル:
extension=swoole.so
Swoole 拡張機能をインストールした後、RPC サーバーの実装を開始できます。ここでは、PHP のリフレクション メカニズムを使用して自動サービス登録を実装し、Swoole のコルーチンを使用して非同期 I/O を処理します。
まず、リモート呼び出しのメソッドを公開するサービス クラスを作成する必要があります。このクラスでは、複数のメソッドを定義し、PHP の DocBlock を使用してメソッドのパラメータと戻り値の型をマークし、ドキュメントとコード ヒントを自動的に生成できます。
/** * @method string hello(string $name) */ class MyService { public function hello(string $name): string { return "Hello, $name!"; } }
上記のコードでは、MyService クラスを定義します。このクラスには、文字列型パラメータ $name を受け取り、文字列型データを返す hello という名前のメソッドが含まれています。
次に、クライアントのリクエストを受信し、サービス クラスの対応するメソッドを呼び出してリクエストを処理するための RPC サーバーを実装する必要があります。
$server = new SwooleServer('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); /** * 注册服务 */ $server->set([ 'worker_num' => 1, 'dispatch_mode' => 1, ]); $myService = new MyService(); $methods = get_class_methods($myService); $availableMethods = []; foreach ($methods as $method) { // 忽略 __* 类型的方法,私有方法和构造方法 if (!preg_match('/^__|^get[A-Z]/i', $method) && is_callable([$myService, $method])) { $availableMethods[] = $method; } } $server->on('WorkerStart', function () use ($availableMethods, $myService) { // 打开协程支持 SwooleRuntime::enableCoroutine(); $service = new HproseSwooleSocketService(); foreach ($availableMethods as $method) { $service->addFunction([$myService, $method], $method); } $server = new HproseSwooleSocketServer('tcp://0.0.0.0:9501'); //监听 RPC 请求 $coroutine = new SwooleCoroutineHttpClient(); $coroutine->setHeaders([ 'Content-Type' => 'text/plain', ]); while (true) { $socket = $server->accept(); if ($socket !== false) { $socket->setOption(['open_length_check' => 1]); $socket->setOption(['package_length_type' => 'N']); $socket->setOption(['package_length_offset' => 0]); $socket->setOption(['package_body_offset' => 4]); $socket->start(); $client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP); $client->connect('127.0.0.1', 9502); $client->send($socket->recv()); $out = $client->recv(); $socket->send($out); $socket->close(); } } }); $server->start();
上記のコードでは、SWOOLE_PROCESS プロセス モードと SWOOLE_SOCK_TCP プロトコルを使用して、127.0.0.1:9501 のアドレスとポートをリッスンする $server オブジェクトを作成しました。
サーバーの起動後、PHP のリフレクション メカニズムを使用して、サービス クラス内の呼び出し可能なすべてのメソッドを取得します。次に、Swoole のコルーチンを使用して RPC リクエストをリッスンし、サービス クラスのメソッドを呼び出してリクエストを処理します。実装プロセスでは、RPC サービスを実装するためのシンプルかつ明確な方法を提供し、非常に使いやすいサードパーティ ライブラリ Hprose を使用しました。
最後に、RPC サービスを要求するクライアントを作成する必要があります。この例では、Hprose に付属する Client クラスを使用してこれを実現できます。
$client = new HproseHttpClient('http://127.0.0.1:9501/', false); echo $client->hello('Swoole');
上記のコードでは、Hprose HTTP クライアント オブジェクトを作成し、サービス クラスの hello メソッドを呼び出して、RPC サーバーへのリクエストを開始します。
Swoole は、PHP プログラムの処理能力を大幅に向上させる多くの非同期、並列、高性能機能を提供する強力なネットワーク通信フレームワークです。この記事の内容を学習することで、高性能、高同時実行性の RPC サーバーを実装し、PHP プログラムの処理と動作効率を向上させることができます。
以上がSwooleは高性能RPCサーバーを実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。