>  기사  >  백엔드 개발  >  PHP가 RPC 서비스를 신속하게 생성하는 방법 분석(코드 데모)

PHP가 RPC 서비스를 신속하게 생성하는 방법 분석(코드 데모)

藏色散人
藏色散人앞으로
2022-11-09 16:18:143218검색

이 기사에서는 RPC가 무엇인지, PHP를 사용하여 RPC 서비스를 간단하고 빠르게 만드는 방법을 소개합니다. 실제로는 매우 간단합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다~

PHP가 RPC 서비스를 신속하게 생성하는 방법 분석(코드 데모)

RPC는 Remote Procedure Call(원격 프로시저 호출)을 의미하며 "원격 프로시저 호출"로 번역됩니다. 주로 서로 다른 시스템 간의 원격 통신 및 상호 호출에 사용됩니다. [추천 학습: PHP 동영상 튜토리얼]

예를 들어 두 개의 시스템이 있는데, 하나는 PHP로 작성되고 다른 하나는 JAVA로 작성되었는데, PHP는 특정 클래스의 특정 메소드를 JAVA로 호출하려고 한다면, RPC가 사용되어야 합니다.

조정하는 방법은 무엇입니까? 직접 조정은 불가능합니다. PHP는 일부 사용자 정의 프로토콜을 통해서만 JAVA 서비스를 요청할 수 있습니다. JAVA는 프로토콜을 구문 분석하고 클래스를 로컬로 인스턴스화하고 메소드를 호출한 다음 결과를 PHP로 반환합니다.

여기서는 PHP의 소켓 확장을 사용하여 서버와 클라이언트를 생성하여 호출 프로세스를 보여줍니다.

RpcServer.php 코드는 다음과 같습니다.

<?php
class RpcServer {
    protected $serv = null;
 
    public function __construct($host, $port, $path) {
        //创建一个tcp socket服务
        $this->serv = stream_socket_server("tcp://{$host}:{$port}", $errno, $errstr);
        if (!$this->serv) {
            exit("{$errno} : {$errstr} \n");
        }
        //判断我们的RPC服务目录是否存在
        $realPath = realpath(__DIR__ . $path);
        if ($realPath === false || !file_exists($realPath)) {
            exit("{$path} error \n");
        }
 
        while (true) {
            $client = stream_socket_accept($this->serv);
 
            if ($client) {
                //这里为了简单,我们一次性读取
                $buf = fread($client, 2048);
                //解析客户端发送过来的协议
                $classRet = preg_match(&#39;/Rpc-Class:\s(.*);\r\n/i&#39;, $buf, $class);
                $methodRet = preg_match(&#39;/Rpc-Method:\s(.*);\r\n/i&#39;, $buf, $method);
                $paramsRet = preg_match(&#39;/Rpc-Params:\s(.*);\r\n/i&#39;, $buf, $params);
                 
                if($classRet && $methodRet) {
                    $class = ucfirst($class[1]);
                    $file = $realPath . &#39;/&#39; . $class . &#39;.php&#39;;
                    //判断文件是否存在,如果有,则引入文件
                    if(file_exists($file)) {
                        require_once $file;
                        //实例化类,并调用客户端指定的方法
                        $obj = new $class();
                        //如果有参数,则传入指定参数
                        if(!$paramsRet) {
                            $data = $obj->$method[1]();
                        } else {
                            $data = $obj->$method[1](json_decode($params[1], true));
                        }
                        //把运行后的结果返回给客户端
                        fwrite($client, $data);
                    }
                } else {
                    fwrite($client, &#39;class or method error&#39;);
                }
                //关闭客户端
                fclose($client);
            }
        }
    }
 
    public function __destruct() {
        fclose($this->serv);
    }
}
 
new RpcServer(&#39;127.0.0.1&#39;, 8888, &#39;./service&#39;);

RpcClient.php 코드는 다음과 같습니다.

<?php
 
class RpcClient {
    protected $urlInfo = array();
     
    public function __construct($url) {
        //解析URL
        $this->urlInfo = parse_url($url);
        if(!$this->urlInfo) {
            exit("{$url} error \n");
        }
    }
     
    public function __call($method, $params) {
        //创建一个客户端
        $client = stream_socket_client("tcp://{$this->urlInfo[&#39;host&#39;]}:{$this->urlInfo[&#39;port&#39;]}", $errno, $errstr);
        if (!$client) {
            exit("{$errno} : {$errstr} \n");
        }
        //传递调用的类名
        $class = basename($this->urlInfo[&#39;path&#39;]);
        $proto = "Rpc-Class: {$class};" . PHP_EOL;
        //传递调用的方法名
        $proto .= "Rpc-Method: {$method};" . PHP_EOL;
        //传递方法的参数
        $params = json_encode($params);
        $proto .= "Rpc-Params: {$params};" . PHP_EOL;
        //向服务端发送我们自定义的协议数据
        fwrite($client, $proto);
        //读取服务端传来的数据
        $data = fread($client, 2048);
        //关闭客户端
        fclose($client);
        return $data;
    }
}
 
$cli = new RpcClient(&#39;http://127.0.0.1:8888/test&#39;);
echo $cli->hehe();
echo $cli->hehe2(array(&#39;name&#39; => &#39;test&#39;, &#39;age&#39; => 27));

그런 다음 위의 두 스크립트를 각각 실행합니다(PHP에서는 환경 변수를 추가해야 합니다).

> php RpcServer.php
> php RpcClient.php

결과는 다음과 같습니다.

Test.php 코드는 다음과 같습니다:

<?php
class Test {
 public function hehe() {
 return &#39;hehe&#39;;
 }
 public function hehe2($params) {
 return json_encode($params);
 }
}

디렉토리 구조는 다음과 같습니다:

위의 사용자 정의 프로토콜은 클라이언트와 서버가 가능한 한 마음대로 수정할 수 있습니다. 통일되고 분석되어야 합니다.

클라이언트는 서버에 요청하여 호출할 클래스, 메서드, 매개 변수를 서버에 전달하고, 서버는 호출 메서드를 인스턴스화하여 결과를 반환합니다.

위 내용은 PHP가 RPC 서비스를 신속하게 생성하는 방법 분석(코드 데모)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제