Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Code-Erklärung des PHP-Remote-Aufrufs und des RPC-Frameworks (Bild)

Detaillierte Code-Erklärung des PHP-Remote-Aufrufs und des RPC-Frameworks (Bild)

黄舟
Freigeben: 2023-03-06 14:06:02
Original
3279 Leute haben es durchsucht

Vorwort

Ein Projekt, von den Anfängen über das Versionsupdate bis hin zur endgültigen Versionspflege. Die Funktionen nehmen ständig zu und auch die entsprechende Menge an Code nimmt zu, was bedeutet, dass das Projekt immer weniger wartbar ist. Zu diesem Zeitpunkt müssen wir ein Projekt aufteilen, damit das Entwicklungsteam das Projekt besser verwalten kann .

In Module unterteilt

Diese Phase ist im Allgemeinen die Anfangsphase des Projekts. Aufgrund unzureichender Arbeitskräfte kann ein serverseitiges Schnittstellenprojekt je nach Entwicklung nur entwickelt und gewartet werden Gewohnheiten, das Projekt wird in mehrere Module unterteilt, die im Rahmen eines Projekts entwickelt und bereitgestellt werden.

Der Nachteil hierbei ist, dass das Projekt mit der Aktualisierung der Version nicht mehr wartbar ist.

Unterprojekte

Da sich die Funktionen jedes Moduls weiter verbessern, wird der Code immer aufgeblähter. Zu diesem Zeitpunkt muss das Projekt, wie im Bild oben, in Benutzersystemprojekte und Zahlungssystemprojekte aufgeteilt werden.

Detaillierte Code-Erklärung des PHP-Remote-Aufrufs und des RPC-Frameworks (Bild)

CURL

Am Anfang wird jeder CURL verwenden, um auf externe Ressourcen zuzugreifen.

Zum Beispiel ist ein bestimmtes SMS-Plattform-SDK, beispielsweise das von großen Drittanbietern bereitgestellte SDK, so verwickelt, dass über die CURL-Funktion direkt auf den Quellcode zugegriffen werden kann.

Der Vorteil besteht darin, dass keine Umweltauflagen bestehen und es direkt verwendet werden kann.
Der Nachteil liegt im Ressourcenbelegungsproblem des gleichzeitigen Zugriffs.

//新浪微博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;
    }
Nach dem Login kopieren

RPC

Remote Procedure Call Protocol

RPC (Remote Procedure Call Protocol) – Remote Procedure Call Protocol, ein Remote Procedure Call Protocol von Protokolle, die Dienste von einem Remote-Computerprogramm anfordern, ohne die zugrunde liegende Netzwerktechnologie zu kennen. Das RPC-Protokoll setzt die Existenz eines Transportprotokolls wie TCP oder UDP voraus, um Informationsdaten zwischen kommunizierenden Programmen zu übertragen. Im OSI-Netzwerkkommunikationsmodell umfasst RPC die Transportschicht und die Anwendungsschicht. RPC erleichtert die Entwicklung von Anwendungen, einschließlich netzwerkverteilter Multiprogramme.

RPC übernimmt den Client/Server-Modus. Der Anforderer ist ein Client und der Dienstanbieter ist ein Server. Zuerst sendet der Client-Aufrufprozess eine Aufrufnachricht mit Prozessparametern an den Dienstprozess und wartet dann auf die Antwortnachricht. Auf der Serverseite bleibt der Prozess im Ruhezustand, bis die Anrufinformationen eintreffen. Wenn eine Anrufnachricht eintrifft, ruft der Server die Prozessparameter ab, berechnet das Ergebnis, sendet eine Antwortnachricht und wartet dann auf die nächste Anrufnachricht. Schließlich ruft der Client den Prozess auf, um die Antwortnachricht zu empfangen, und ruft das Prozessergebnis ab dann wird die Aufrufausführung fortgesetzt.

Yar

Das von Bird Brother produzierte RPC-Framework ist ein leichtes 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();?>
Nach dem Login kopieren

Aufrufcode

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

Es sollte beachtet werden, dass Niao Ges Sachen weniger Dokumentation haben und mehr Debugging erfordern.

Thrift

Thrift ist ein Software-Framework, das für die Entwicklung skalierbarer und sprachübergreifender Dienste verwendet wird. Es kombiniert einen leistungsstarken Software-Stack und eine Code-Generierungs-Engine zum Erstellen zwischen den Programmiersprachen C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk und OCaml Nahtlos integrierter und effizienter Service.

Die Bedeutung von Fernanrufen besteht darin, dass verschiedene Teilprojekte Sprachen verwenden können, die für sie besser geeignet sind, um ihre Bedürfnisse effizienter zu lösen.

Gleichzeitig kann es für die Teamentwicklung das allgemeine technische Niveau verbessern.

SOAP

Da XML verwendet wird, werde ich es nicht viel beschreiben. Schließlich wird hauptsächlich JSON verwendet.

JSON-RPC

Das Folgende ist der Standard für Rückgabewerte

--> [
    {"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"}
    ]
Nach dem Login kopieren

Tatsächlich werden Sie feststellen, dass wir den Rückgabewert der Schnittstelle für bereitstellen Client, der auf diesem Standard basiert.

Entsprechend muss auch der Server diesem Standard folgen, wenn er Daten vom Server empfängt und zurücksendet.

Änderungen durch Projektaufteilung

Projektverfeinerung

Ein Modul entspricht einem Projekt, und der ressourcenorientierte Datenzugriff erfolgt zwischen Projekten über REST-basierte Schnittstellenstandards.

Personalbedarf

Die Prämisse der Projektaufteilung ist, dass ein Projekt nicht ausreicht, um die bestehenden Geschäftsentwicklungsanforderungen zu erfüllen, was bedeutet, dass die Anzahl der Entwickler nach der Aufteilung zunimmt.

Der Sprung von der Guerilla zur regulären Armee!

Dokumente

Mehr Projekte bedeuten mehr Schnittstellenaufrufe und Dokumente. Die ordnungsgemäße Verarbeitung von Dokumenten kann die Effizienz der Teamzusammenarbeit verbessern.

Postscript

Beim Fernaufruf von Diensten geht es darum, wie man ein Projekt, das nicht mehr wartbar wird, aus der Teergrube retten und das Gesamtgeschäftsvolumen erhöhen kann, das das Projekt jedoch tragen kann ist kein Allheilmittel.

Das obige ist der detaillierte Inhalt vonDetaillierte Code-Erklärung des PHP-Remote-Aufrufs und des RPC-Frameworks (Bild). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage