Home >Backend Development >PHP Tutorial >Detailed code explanation of PHP remote calling and RPC framework (picture)

Detailed code explanation of PHP remote calling and RPC framework (picture)

黄舟
黄舟Original
2017-03-11 09:15:363307browse

Preface

A project, from the beginning to the version update, all the way to the final version maintenance. Functions are constantly increasing, and the corresponding amount of code is also increasing, which means that the project becomes more unmaintainable. At this time, we need to break up a project by splitting so that the development team can better carry out the project. maintain.

Divided into modules

This stage is generally the initial stage of the project. Due to insufficient manpower, a server-side interface project has only one development and maintenance. According to development habits, the project will be divided into several Modules are developed and deployed under a project.

The disadvantage of this is that the project will become unmaintainable as the version is updated.

Sub-project

As the functions of each module continue to improve, the code becomes more bloated. At this time, the project needs to be split, such as the picture above, into user system projects and payment system projects.

Detailed code explanation of PHP remote calling and RPC framework (picture)

CURL

In the beginning, everyone will use CURL to access external resources.

For example, a certain SMS platform SDK, such as the SDK provided by major third parties, is so entangled that the source code is directly accessed using the CURL function.

The advantage is that there are no environmental requirements and it can be used directly.
The disadvantage lies in the resource occupation problem of concurrent access.

//新浪微博SDK的http请求部分源码
 /**
     * Make an HTTP request
     *
     * @return string API results
     * @ignore
     */
    function http($url, $method, $postfields = NULL, $headers = array()) {
        $this->http_info = array();        
        $ci = curl_init();        
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
        curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ci, CURLOPT_ENCODING, "");
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);        
        if (version_compare(phpversion(), &#39;5.4.0&#39;, &#39;<&#39;)) {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1);
        } else {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
        }
        curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, &#39;getHeader&#39;));
        curl_setopt($ci, CURLOPT_HEADER, FALSE);        
        switch ($method) {            
        case &#39;POST&#39;:
                curl_setopt($ci, CURLOPT_POST, TRUE);                
                if (!empty($postfields)) {
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);                    
                    $this->postdata = $postfields;
                }                
                break;            
                case &#39;DELETE&#39;:
                curl_setopt($ci, CURLOPT_CUSTOMREQUEST, &#39;DELETE&#39;);                
                if (!empty($postfields)) {                    
                $url = "{$url}?{$postfields}";
                }
        }        if ( isset($this->access_token) && $this->access_token )            
        $headers[] = "Authorization: OAuth2 ".$this->access_token;        
        if ( !empty($this->remote_ip) ) {            
        if ( defined(&#39;SAE_ACCESSKEY&#39;) ) {                
        $headers[] = "SaeRemoteIP: " . $this->remote_ip;
            } else {                
            $headers[] = "API-RemoteIP: " . $this->remote_ip;
            }
        } else {            
        if ( !defined(&#39;SAE_ACCESSKEY&#39;) ) {//                
        $headers[] = "API-RemoteIP: " . $_SERVER[&#39;REMOTE_ADDR&#39;];
            }
        }
        curl_setopt($ci, CURLOPT_URL, $url );
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );        
        $response = curl_exec($ci);        
        $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);        
        $this->http_info = array_merge($this->http_info, curl_getinfo($ci));        
        $this->url = $url;        
        if ($this->debug) {            
        echo "=====post data======\r\n";
            var_dump($postfields);            
            echo "=====headers======\r\n";
            print_r($headers);            
            echo &#39;=====request info=====&#39;."\r\n";
            print_r( curl_getinfo($ci) );            
            echo &#39;=====response=====&#39;."\r\n";
            print_r( $response );
        }
        curl_close ($ci);        
        return $response;
    }

RPC

Remote Procedure Call Protocol

RPC (Remote Procedure Call Protocol)-Remote Procedure Call Protocol, it is a remote procedure call protocol from a remote computer through the network Programmatically request services without understanding the protocols of the underlying network technology. The RPC protocol assumes the existence of some transport protocol, such as TCP or UDP, to carry information data between communicating programs. In the OSI network communication model, RPC spans the transport layer and application layer. RPC makes it easier to develop applications including network-distributed multi-programs.

RPC adopts client/server mode. The requester is a client, and the service provider is a server. First, the client calling process sends a calling message with process parameters to the service process, and then waits for the response message. On the server side, the process remains asleep until the calling information arrives. When a call message arrives, the server obtains the process parameters, calculates the result, sends a reply message, and then waits for the next call message. Finally, the client calls the process to receive the reply message, obtains the process result, and then the call execution continues.

Yar

The RPC framework produced by Bird Brother is a lightweight framework.

<?phpclass API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function api($parameter, $option = "foo") {
    }    protected function client_can_not_see() {
    }
}$service = new Yar_Server(new API());$service->handle();?>

Calling code

<?php$client = new Yar_Client("http://host/api/");$result = $client->api("parameter);
?>

It should be noted that Brother Bird’s products have less documentation and require more debugging.

Thrift

Thrift is a software framework used for the development of scalable and cross-language services. It combines a powerful software stack and code generation engine to build among the programming languages ​​​​of C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml Seamlessly integrated and efficient service.

The significance of remote calling is that different sub-projects can use languages ​​that are more suitable for them to solve and achieve their needs more efficiently.

At the same time, for team development, it can improve the overall technical level.

SOAP

Since XML is used, I won’t describe it much. After all, json is mostly used.

JSON-RPC

The following is the standard for return values

--> [
    {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
    {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
    {"foo": "boo"},
    {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
    {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 
    ]
<-- [
    {"jsonrpc": "2.0", "result": 7, "id": "1"},
    {"jsonrpc": "2.0", "result": 19, "id": "2"},
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
    {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
    {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
    ]

In fact, you will find that we are providing the return value of the interface to the client, which is done in accordance with this standard of.

Correspondingly, the server must also follow this standard when receiving and returning data from the server.

Changes brought about by project split

Project refinement

One module corresponds to one project, and resource-oriented data access is performed between projects through REST-based interface standards.

Staff requirements

The premise of project split is that one project is not enough to meet the existing business development requirements, which means the number of developers will increase after the split.

The leap from guerrillas to regular army formation!

Documentation

More projects mean more interface call documents, and proper processing of documents can better improve team collaboration efficiency.

Postscript

The remote calling of services lies in how to reasonably rescue a project that is becoming unmaintainable from the tar pit and increase the overall business volume that the project can carry. However, the world There is no silver bullet.

The above is the detailed content of Detailed code explanation of PHP remote calling and RPC framework (picture). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn