ホームページ  >  記事  >  PHPフレームワーク  >  Swoole を使用して高パフォーマンスの JSONRPC サービスを実装する方法

Swoole を使用して高パフォーマンスの JSONRPC サービスを実装する方法

王林
王林オリジナル
2023-06-25 10:24:241253ブラウズ

ネットワーク開発において、RPC (リモート プロシージャ コール) は、リモート プログラムが相互に呼び出して分散アプリケーションを実装できるようにする一般的な通信プロトコルです。近年、PHP エコシステムの開発が成熟し続けるにつれて、PHP 言語で高パフォーマンスの RPC を実装する必要性がますます高まっています。Swoole は、PHP 拡張機能として、非同期、同時、高パフォーマンスのネットワークを提供します。通信機能を強化し、高パフォーマンス RPC を実現する方法となっており、パフォーマンス RPC に最適な選択肢です。

この記事では、Swoole を使用して高パフォーマンスの JSONRPC サービスを実装し、それによってアプリケーションのパフォーマンスとスループットを向上させる方法に焦点を当てます。

1. JSONRPC プロトコルの概要

JSONRPC (JavaScript Object Notation Remote Procedure Call) は、JSON 形式に基づく軽量のリモート呼び出しプロトコルであり、統一されたインターフェイス仕様のセットを定義しています。 -さまざまなアプリケーション間の無料通信。 JSONRPC プロトコルでは、各リクエストとレスポンスは JSON オブジェクトであり、どちらにもリクエストとレスポンスの間の対応関係を識別する ID フィールドが含まれています。

リクエストの例:

{
    "jsonrpc": "2.0",
    "method": "login",
    "params": {
        "username": "user",
        "password": "pass"
    },
    "id": 1
}

レスポンスの例:

{
    "jsonrpc": "2.0",
    "result": true,
    "id": 1
}

JSONRPC プロトコルでは、リクエスタはメソッド フィールドとパラメータ フィールドを含むリクエストを送信することで他のアプリケーションを呼び出します。 ; プロバイダーは、結果フィールドを含む応答を返すことによって呼び出し結果を返します。 JSONRPC プロトコルはバッチ リクエストとバッチ レスポンスをサポートしているため、ネットワーク通信のオーバーヘッドを効果的に削減できます。

2. Swoole を使用して JSONRPC サービスを実装する

  1. Swoole のインストール

始める前に、まず Swoole 拡張機能をインストールする必要があります。次のコマンドを使用してインストールできます:

pecl install swoole

次の行を php.ini ファイルに追加してインストールすることもできます:

extension=swoole.so

インストールが完了したら、php.ini ファイルを使用できます。 -m コマンドを使用して、swoole 拡張機能が正常にインストールされたかどうかを確認します。

  1. JSONRPC サーバーの実装

単純な JSONRPC サーバーを実装しましょう。具体的なコードは次のとおりです:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use SwooleHttpServer;
use SwooleHttpRequest;
use SwooleHttpResponse;

$server = new Server('0.0.0.0', 8080);

$server->on('Request', function (Request $request, Response $response) {
    $data = $request->rawContent();
    $arr = json_decode($data, true);
    if (isset($arr['method'])) {
        switch ($arr['method']) {
            case 'login':
                $result = login($arr['params']['username'], $arr['params']['password']);
                break;
            case 'register':
                $result = register($arr['params']['username'], $arr['params']['password']);
                break;
            default:
                $result = ['error' => 'Method not found'];
                break;
        }
    } else {
        $result = ['error' => 'Invalid request'];
    }
    $response->header('Content-Type', 'application/json');
    $response->end(json_encode([
        'jsonrpc' => '2.0',
        'result' => $result,
        'id' => $arr['id']
    ]));
});

function login($username, $password)
{
    // do login
    return true;
}

function register($username, $password)
{
    // do register
    return true;
}

$server->start();

上記のコードは、JSONRPC サーバーを実装します。ログイン メソッドと登録メソッドを処理するメソッドは、リクエスト本文のデータを解析し、対応するメソッドを呼び出して処理し、最終的に処理結果を JSON 形式で返します。

  1. JSONRPC クライアントの実装

JSONRPC サーバーの機能をテストするには、JSONRPC クライアントも実装する必要があります。具体的なコードは次のとおりです:

<?php

class JsonRpcClient
{
    private $host;
    private $port;
    private $id;

    public function __construct($host, $port)
    {
        $this->host = $host;
        $this->port = $port;
        $this->id = 0;
    }

    public function send($method, $params)
    {
        $client = new SwooleClient(SWOOLE_SOCK_TCP);
        if (!$client->connect($this->host, $this->port, 0.5)) {
            throw new Exception('Connect failed');
        }
        $client->send(json_encode([
            'jsonrpc' => '2.0',
            'method' => $method,
            'params' => $params,
            'id' => ++$this->id,
        ]));
        $data = $client->recv();
        if (!$data) {
            throw new Exception('Recv failed');
        }
        $client->close();
        $response = json_decode($data, true);
        if (isset($response['error'])) {
            throw new Exception($response['error']['message']);
        }
        return $response['result'];
    }
}

$client = new JsonRpcClient('127.0.0.1', 8080);

try {
    $result = $client->send('login', ['username' => 'user', 'password' => 'pass']);
    var_dump($result);
} catch (Exception $e) {
    echo $e->getMessage();
}

上記のコードは、JSONRPC サーバーにリクエストを送信し、応答結果を取得できる JSONRPC クライアントを実装しています。 sendメソッドを呼び出し、methodとparamsパラメータを渡すことでJSONRPCサーバーにリクエストを送信し、レスポンス結果を取得できます。リクエストが失敗した場合、またはエラー メッセージが返された場合は、例外がスローされます。

3. Swoole に基づく JSONRPC サービスのパフォーマンス テスト

Swoole に基づく JSONRPC サービスのパフォーマンスの利点を検証するために、簡単なパフォーマンス テストを実行できます。テスト環境の構成は次のとおりです。

    #CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
  • Memory: 16GB
  • OS: Ubuntu 20.04.2 LTS
  • PHP バージョン: 7.4.22
  • Swoole バージョン: 4.7.1
テスト方法:

    上記で実装された JSONRPC サーバーとクライアント コードを使用します。
  1. ab コマンドを実行して、1,000 個の同時リクエストをシミュレートし、各リクエストを 400 回送信します。
  2. テスト結果を記録して比較します。
テスト結果は次のとおりです:

Concurrency Level:      1000
Time taken for tests:   1.701 seconds
Complete requests:      400000
Failed requests:        0
Total transferred:      78800000 bytes
Requests per second:    235242.03 [#/sec] (mean)
Time per request:       42.527 [ms] (mean)
Time per request:       0.043 [ms] (mean, across all concurrent requests)
Transfer rate:          45388.31 [Kbytes/sec] received

テスト結果から、Swoole ベースの JSONRPC サービスは非常に高いパフォーマンスを持っています。1,000 件の同時リクエストの場合、各リクエストは平均処理時間はわずか 42.527 ミリ秒で、リクエスト スループットは 235242.03 回/秒に達します。

4. 概要

この記事では、Swoole を使用して高パフォーマンスの JSONRPC サービスを実装する方法を紹介し、パフォーマンス テストを通じてそのパフォーマンスの利点を証明します。実際のアプリケーションでは、ニーズに応じて複雑な RPC サービスを実装し、Swoole の非同期、同時実行、および高性能機能を通じてアプリケーションのパフォーマンスとユーザー エクスペリエンスを向上させることができます。

以上がSwoole を使用して高パフォーマンスの JSONRPC サービスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。