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.
Sebelum kita mula menulis kod, kita perlu mengetahui perkara berikut:
Kami boleh menggunakan PHP untuk melaksanakan klien RPC mudah, yang bertanggungjawab untuk menghantar permintaan dan menerima respons. Aliran kerjanya adalah seperti berikut:
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; } }
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.
Melaksanakan protokol RPC pada pelayan memerlukan langkah berikut:
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 ]); } }
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.
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!