Rumah > pembangunan bahagian belakang > masalah PHP > Bagaimana untuk melaksanakan klien RPC mudah menggunakan PHP

Bagaimana untuk melaksanakan klien RPC mudah menggunakan PHP

PHPz
Lepaskan: 2023-04-24 15:03:08
asal
802 orang telah melayarinya

RPC (Remote Procedure Call) ialah protokol komunikasi komputer yang membenarkan program memanggil subrutin dalam ruang atau mesin lain. Protokol ini membolehkan kami memanggil fungsi dalam perkhidmatan jauh sama seperti memanggil fungsi tempatan, dengan syarat kami mesti melaksanakan klien dan pelayan protokol RPC.

Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan RPC mudah Kami akan menggunakan protokol JSON-RPC, iaitu protokol yang ringan dan ringkas.

  1. Persediaan

Sebelum kita mula menulis kod, kita perlu mengetahui perkara berikut:

  • Apakah itu protokol JSON-RPC dan ia mempunyai Apakah ciri-cirinya?
  • Pengaturcaraan soket dalam PHP, terutamanya penggunaan soket.
  • Penghuraian dan siri JSON untuk PHP.
  1. PHP melaksanakan klien RPC ringkas

Kami boleh menggunakan PHP untuk melaksanakan klien RPC mudah, yang bertanggungjawab untuk menghantar permintaan dan menerima respons. Aliran kerjanya adalah seperti berikut:

  • Buat soket soket.
  • Buat soket menggunakan fungsi socket_create().
  • Gunakan fungsi socket_connect() untuk menyambung ke pelayan.
  • Hantar maklumat permintaan ke pelayan.
  • Gunakan fungsi socket_read() untuk membaca keputusan yang dikembalikan oleh pelayan.

Berikut ialah contoh pelaksanaan:

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;
    }
}
Salin selepas log masuk

Dalam kod di atas, kaedah connect() mencipta soket dan menggunakan socket_connect() untuk menyambung ke pelayan RPC . Kaedah call() akan menghantar maklumat permintaan dalam format JSON, dan kaedah send() akan menghantar maklumat permintaan kepada pelayan dan mengembalikan hasil respons pelayan.

Apabila mencipta objek RpcClient, anda perlu memasukkan alamat dan port yang pelayan mendengar dan tempoh tamat masa untuk menunggu sambungan.

  1. PHP melaksanakan pelayan RPC ringkas

Melaksanakan protokol RPC pada pelayan memerlukan langkah berikut:

  • Buat soket soket mendengar .
  • Gunakan fungsi socket_bind() untuk mengikat soket ke alamat IP dan nombor port tertentu.
  • Gunakan fungsi socket_listen() untuk mendengar soket.
  • Gunakan fungsi socket_accept() untuk menerima permintaan sambungan pelanggan dan mengembalikan soket baharu.
  • Menghuraikan maklumat permintaan pelanggan dan melaksanakan fungsi yang sepadan.
  • Hantar maklumat respons kepada pelanggan.

Berikut ialah contoh pelayan RPC mudah:

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
        ]);
    }
}
Salin selepas log masuk

Dalam kod di atas, kaedah listen() mencipta soket dan menggunakan socket_bind() Mengikat pada alamat IP dan port yang ditentukan. Kemudian socket_listen() dipanggil untuk mendengar pada soket, menerima permintaan sambungan klien dan menggunakan fungsi socket_accept() untuk mengembalikan soket baharu untuk komunikasi.

Seterusnya, pelayan akan menghuraikan maklumat permintaan klien dan menentukan sama ada kaedah yang diminta oleh klien wujud Jika ia tidak wujud, ia akan mengembalikan kod ralat. Jika kaedah itu wujud, pelayan akan melaksanakan fungsi yang sepadan dan menghantar hasilnya kepada klien.

Apabila mencipta objek RpcServer, anda perlu memasukkan alamat dan port yang pelayan mendengar dan tempoh tamat masa untuk menunggu sambungan.

  1. Ringkasan

Dalam artikel ini, kami mempelajari cara melaksanakan aplikasi RPC mudah menggunakan PHP dan berkomunikasi menggunakan protokol JSON-RPC. Melalui kajian artikel ini, kami memahami prinsip asas protokol RPC, memahami penggunaan asas pengaturcaraan soket, menguasai kaedah penghuraian dan penyiaran JSON PHP, dan boleh mengkaji lebih lanjut protokol RPC dan senario aplikasi yang berkaitan dengan mendalam.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan klien RPC mudah menggunakan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan