搜尋
首頁後端開發php教程PHP遠端呼叫以及RPC框架的程式碼詳解(圖)

前言

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

分模組

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

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

分項目

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

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
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)