Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie einen einfachen RPC-Client mit PHP

So implementieren Sie einen einfachen RPC-Client mit PHP

PHPz
PHPzOriginal
2023-04-24 14:53:00766Durchsuche

RPC (Remote Procedure Call) ist ein Computerkommunikationsprotokoll, das es einem Programm ermöglicht, eine Unterroutine in einem anderen Raum oder einer anderen Maschine aufzurufen. Dieses Protokoll ermöglicht es uns, Funktionen in Remote-Diensten genauso aufzurufen wie lokale Funktionen, vorausgesetzt, wir müssen den Client und Server des RPC-Protokolls implementieren.

In diesem Artikel erfahren Sie, wie Sie einen einfachen RPC mit PHP implementieren. Wir verwenden das JSON-RPC-Protokoll, ein leichtes und einfaches Protokoll.

  1. Vorbereitung

Bevor wir mit dem Schreiben von Code beginnen, müssen wir Folgendes wissen:

  • Was ist das JSON-RPC-Protokoll und welche Eigenschaften hat es?
  • PHP-Socket-Programmierung, insbesondere die Verwendung von Socket-Sockets.
  • JSON-Parsing und Serialisierung für PHP.
  1. PHP implementiert einen einfachen RPC-Client

Wir können PHP verwenden, um einen einfachen RPC-Client zu implementieren, der für das Senden von Anfragen und den Empfang von Antworten verantwortlich ist. Der Arbeitsablauf ist wie folgt:

  • Erstellen Sie einen Socket-Socket.
  • Verwenden Sie die Funktion socket_create(), um einen Socket zu erstellen.
  • Verwenden Sie die Funktion socket_connect(), um eine Verbindung zum Server herzustellen.
  • Senden Sie die Anforderungsinformationen an den Server.
  • Verwenden Sie die Funktion socket_read(), um die vom Server zurückgegebenen Ergebnisse zu lesen.

Das Folgende ist ein Implementierungsbeispiel:

class RpcClient
{
    private $url;
    private $port;
    private $timeout;
    private $socket;

    public function __construct($url, $port, $timeout = 30)
    {
        $this->url = $url;
        $this->port = $port;
        $this->timeout = $timeout;
        $this->connect();
    }

    private function connect()
    {
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($this->socket === false) {
            throw new Exception("unable to create socket: " . socket_strerror(socket_last_error()));
        }
        $result = socket_connect($this->socket, $this->url, $this->port);
        if ($result === false) {
            throw new Exception("unable to connect socket: " . socket_strerror(socket_last_error()));
        }
    }

    public function call($function_name, $parameters = [])
    {
        $request_body = json_encode([
            "jsonrpc" => "2.0",
            "method" => $function_name,
            "params" => $parameters,
            "id" => 1
        ]);

        $result = $this->send($request_body);
        $response = json_decode($result, true);
        if ($response['id'] != 1) {
            throw new Exception("incorrect response ID (expected: 1, actual: " . $response['id'] . ")");
        }

        if (isset($response['error'])) {
            throw new Exception("server returned error: " . print_r($response, true));
        }

        return $response['result'];
    }

    private function send($request_body)
    {
        $result = socket_write($this->socket, $request_body . "\n", strlen($request_body) + 1);
        if ($result === false) {
            throw new Exception("unable to send request: " . socket_strerror(socket_last_error()));
        }

        $response = "";
        do {
            $buffer = socket_read($this->socket, 1024);
            $response .= $buffer;
            if (strlen($buffer) < 1024) {
                break;
            }
        } while(true);

        return $response;
    }
}

Im obigen Code erstellt die connect()-Methode einen Socket und verwendet socket_connect(), um eine Verbindung zum RPC-Server herzustellen. Die Methode call() sendet Anforderungsinformationen im JSON-Format, und die Methode send() sendet die Anforderungsinformationen an den Server und gibt das Antwortergebnis des Servers zurück.

Beim Erstellen des RpcClient-Objekts müssen Sie die Adresse und den Port übergeben, auf denen der Server lauscht, sowie die Zeitüberschreitungsdauer für das Warten auf eine Verbindung.

  1. PHP implementiert einen einfachen RPC-Server

Die Implementierung des RPC-Protokolls auf dem Server erfordert die folgenden Schritte:

  • Erstellen Sie einen Listening-Socket.
  • Verwenden Sie die Funktion socket_bind(), um den Socket an eine bestimmte IP-Adresse und Portnummer zu binden.
  • Verwenden Sie die Funktion socket_listen(), um den Socket abzuhören.
  • Verwenden Sie die Funktion socket_accept(), um eine Client-Verbindungsanfrage anzunehmen und einen neuen Socket zurückzugeben.
  • Parsen Sie die Anfrageinformationen des Kunden und führen Sie die entsprechende Funktion aus.
  • Antwortinformationen an den Kunden senden.

Hier ist ein Beispiel für einen einfachen RPC-Server:

class RpcServer
{
    private $url;
    private $port;
    private $timeout;
    private $socket;

    public function __construct($url, $port, $timeout = 30)
    {
        $this->url = $url;
        $this->port = $port;
        $this->timeout = $timeout;
        $this->listen();
    }

    private function listen()
    {
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($this->socket === false) {
            throw new Exception("unable to create socket: " . socket_strerror(socket_last_error()));
        }

        $result = socket_bind($this->socket, $this->url, $this->port);
        if ($result === false) {
            throw new Exception("unable to bind socket to $this->url:$this->port: " . socket_strerror(socket_last_error()));
        }

        $result = socket_listen($this->socket, 5);
        if ($result === false) {
            throw new Exception("unable to listen on socket: " . socket_strerror(socket_last_error()));
        }

        while (true) {
            $client = socket_accept($this->socket);
            $request_string = socket_read($client, 1024);
            $response_string = $this->handle_request($request_string);
            socket_write($client, $response_string, strlen($response_string));
            socket_close($client);
        }
    }

    private function handle_request($request_string)
    {
        $request = json_decode($request_string, true);
        $method = $request['method'];
        $params = $request['params'];

        if (!function_exists($method)) {
            return json_encode([
                "jsonrpc" => "2.0",
                "id" => $request['id'],
                "error" => [
                    "code" => -32601,
                    "message" => "Method not found"
                ]
            ]);
        }

        $result = call_user_func_array($method, $params);

        return json_encode([
            "jsonrpc" => "2.0",
            "id" => $request['id'],
            "result" => $result
        ]);
    }
}

Im obigen Code erstellt die listen()-Methode einen Socket und verwendet socket_bind(), um eine Bindung an die angegebene IP-Adresse und den angegebenen Port herzustellen. Dann wird socket_listen() aufgerufen, um den Socket abzuhören, die Client-Verbindungsanfrage zu akzeptieren und die Funktion socket_accept() zu verwenden, um einen neuen Socket für die Kommunikation zurückzugeben.

Als nächstes analysiert der Server die Anforderungsinformationen des Clients und stellt fest, ob die vom Client angeforderte Methode vorhanden ist. Wenn sie nicht vorhanden ist, wird ein Fehlercode zurückgegeben. Wenn die Methode vorhanden ist, führt der Server die entsprechende Funktion aus und sendet das Ergebnis an den Client.

Beim Erstellen eines RpcServer-Objekts müssen Sie die Adresse und den Port übergeben, auf denen der Server lauscht, sowie die Zeitüberschreitungsdauer für das Warten auf eine Verbindung.

  1. Zusammenfassung

In diesem Artikel haben wir gelernt, wie man eine einfache RPC-Anwendung mit PHP implementiert und über das JSON-RPC-Protokoll kommuniziert. Durch das Studium dieses Artikels verstehen wir die Grundprinzipien des RPC-Protokolls, verstehen die grundlegende Verwendung der Socket-Programmierung und beherrschen die JSON-Analyse- und Serialisierungsmethoden von PHP. Wir können das RPC-Protokoll und verwandte Anwendungsszenarien eingehend untersuchen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen einfachen RPC-Client mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn