首頁  >  文章  >  後端開發  >  PHP遠端呼叫以及RPC框架的程式碼詳解(圖)

PHP遠端呼叫以及RPC框架的程式碼詳解(圖)

黄舟
黄舟原創
2017-03-11 09:15:363202瀏覽

前言

一個項目,從開始到版本更新,一直到最後的版本維護。功能不斷增多,對應的程式碼量也不斷增加,也就意味著專案變得更不可維護,這時候,我們需要用分割的方式將一個專案打散,以便開發團隊更好的對專案進行維護。

分模組

這個階段,一般也是專案的初級階段,由於人手不夠,一個服務端的介面專案只有一個開發進行維護,根據開發的習慣,會把專案分成若干個模組進行開發,在一個專案下進行部署。

這樣做的缺點在於專案會隨著版本更新而變得無法維護。

分項目

隨著每個模組功能的不斷完善,程式碼變得更加臃腫。這時候需要將項目拆分,例如上面的圖,分成使用者係統項目、支付體系項目。

PHP遠端呼叫以及RPC框架的程式碼詳解(圖)

CURL

開始大家會採用CURL的方式來存取外部資源。

例如某短訊平台SDK,例如各大第三方提供的SDK,糾結到原始碼發現都是直接採用CURL函數的方式進行存取。

優點在於沒有環境要求,能直接用。
缺點在於並發存取的資源佔用問題。

//新浪微博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

遠端過程呼叫協定

RPC(Remote Procedure Call Protocol)-遠端過程呼叫協議,它是一種透過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協定。 RPC協定假定某些傳輸協定的存在,如TCP或UDP,為通訊程序之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。 RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供者就是一個伺服器。首先,客戶機呼叫進程發送一個有進程參數的呼叫資訊到服務進程,然後等待應答資訊。在伺服器端,進程保持睡眠狀態直到呼叫資訊到達為止。當一個呼叫訊息到達,伺服器獲得進程參數,計算結果,發送答案訊息,然後等待下一個呼叫訊息,最後,客戶端呼叫進程接收答案訊息,獲得進程結果,然後呼叫執行繼續進行。

Yar

鳥哥出品的RPC框架,輕量級框架。

<?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();?>

呼叫程式碼

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

注意的是鳥哥出的東西文檔比較少,需要多調試。

Thrift

thrift是一個軟體框架,用來進行可擴展且跨語言的服務的開發。它結合了功能強大的軟體堆疊和程式碼產生引擎,以建立在C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些程式語言間無縫結合的、高效率的服務。

遠端呼叫的意義在於,不同的子專案可以用更適合自己的語言來解決,更有效率的實作需求。

同時,對團隊的開發來講,更能提升整體的技術水準。

SOAP

由於用的XML就不多描述了,畢竟還是json用的多。

JSON-RPC

下面是一個傳回值的標準

--> [
    {"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"}
    ]

#你會發現我們在提供客戶端的介面回傳值,就是依照這個標準來做的。

對應的,服務端對服務端的資料接收與傳回,也要同樣依照這個標準來做。

專案分割帶來的變更

專案細化

一個模組對應一個項目,專案之間透過基於REST的介面標準進行資源導向的資料存取。

人員需求

專案分割的前提是專案不足以滿足現有的業務發展要求,也就意味著拆分後的開發人員數量的擴增。

遊擊隊向正規軍編制的跨越!

文檔

更多的專案也意味著更多的介面呼叫文檔,適當的處理文檔才能更好的提高團隊協作效率。

後記

服務的遠端呼叫在於怎麼合理的把一個正在變得不可維護的專案從焦油坑中解救出來,並提高專案整體能承載的業務量,不過,世界上沒有銀彈。

以上是PHP遠端呼叫以及RPC框架的程式碼詳解(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn