Maison  >  Article  >  développement back-end  >  Explication détaillée du code des appels à distance PHP et du framework RPC (image)

Explication détaillée du code des appels à distance PHP et du framework RPC (image)

黄舟
黄舟original
2017-03-11 09:15:363255parcourir

Avant-propos

Un projet, du début à la mise à jour de la version, jusqu'à la maintenance de la version finale. Les fonctions augmentent constamment et la quantité de code correspondante augmente également, ce qui signifie que le projet devient de plus en plus impossible à maintenir. À ce stade, nous devons diviser un projet en le divisant afin que l'équipe de développement puisse mieux le maintenir. .

Divisé en modules

Cette étape est généralement la phase initiale du projet. En raison d'une main-d'œuvre insuffisante, un projet d'interface côté serveur ne peut être développé et maintenu que par un seul développeur. habitudes, le projet sera divisé en plusieurs modules développés et déployés dans le cadre d'un projet.

L'inconvénient est que le projet deviendra inmaintenable à mesure que la version sera mise à jour.

Sous-projets

À mesure que les fonctions de chaque module continuent de s'améliorer, le code devient plus volumineux. À l'heure actuelle, le projet doit être divisé, comme dans l'image ci-dessus, en projets de système utilisateur et projets de système de paiement.

Explication détaillée du code des appels à distance PHP et du framework RPC (image)

CURL

Au début, tout le monde utilisera CURL pour accéder à des ressources externes.

Par exemple, un certain SDK de plateforme SMS, tel que le SDK fourni par des tiers majeurs, est tellement enchevêtré que le code source est directement accessible à l'aide de la fonction CURL.

L'avantage est qu'il n'y a aucune exigence environnementale et qu'il peut être utilisé directement.
L'inconvénient réside dans le problème d'occupation des ressources de l'accès simultané.

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

Protocole d'appel de procédure à distance

RPC (Protocole d'appel de procédure à distance) - Protocole d'appel de procédure à distance, qui est un protocole d'appel de procédure à distance de Protocoles qui demandent des services sur un programme informatique distant sans connaître la technologie réseau sous-jacente. Le protocole RPC suppose l'existence d'un protocole de transport, tel que TCP ou UDP, pour transporter les données d'information entre les programmes communicants. Dans le modèle de communication réseau OSI, RPC couvre la couche transport et la couche application. RPC facilite le développement d'applications, notamment de multi-programmes distribués en réseau.

RPC adopte le mode client/serveur. Le demandeur est un client et le fournisseur de services est un serveur. Tout d'abord, le processus appelant client envoie un message d'appel avec les paramètres de processus au processus de service, puis attend le message de réponse. Côté serveur, le processus reste en veille jusqu'à ce que les informations d'appel arrivent. Lorsqu'un message d'appel arrive, le serveur obtient les paramètres du processus, calcule le résultat, envoie un message de réponse, puis attend le prochain message d'appel. Enfin, le client appelle le processus pour recevoir le message de réponse, obtient le résultat du processus et. puis l'exécution de l'appel continue.

Yar

Le framework RPC produit par Bird Brother est un framework léger.

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

Code d'appel

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

Il convient de noter que les éléments de Niao Ge ont moins de documentation et nécessitent plus de débogage.

Thrift

Thrift est un framework logiciel utilisé pour le développement de services évolutifs et multilingues. Il combine une puissante pile logicielle et un moteur de génération de code pour construire entre C, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk et OCaml. Service parfaitement intégré et efficace.

L'importance des appels à distance est que différents sous-projets peuvent utiliser des langages qui leur conviennent mieux pour résoudre et réaliser leurs besoins plus efficacement.

En même temps, pour le développement de l'équipe, cela peut améliorer le niveau technique global.

SOAP

Puisque XML est utilisé, je ne le décrirai pas beaucoup. Après tout, json est principalement utilisé.

JSON-RPC

Ce qui suit est la norme pour les valeurs de retour

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

En fait, vous constaterez que nous fournissons la valeur de retour de l'interface au client, qui s'appuie sur ce standard Made to do.

En conséquence, le serveur doit également suivre cette norme lors de la réception et du renvoi des données du serveur.

Changements provoqués par le fractionnement du projet

Affinement du projet

Un module correspond à un projet, et l'accès aux données orienté ressources est effectué entre les projets via des normes d'interface basées sur REST.

Exigences en matière de personnel

Le principe de la scission des projets est qu'un seul projet ne suffit pas pour répondre aux exigences de développement commercial existantes, ce qui signifie que le nombre de développeurs augmentera après la scission.

Le passage de la guérilla à l'armée régulière !

Documents

Plus de projets signifie plus d'appels d'interface et de documents. Un traitement approprié des documents peut mieux améliorer l'efficacité de la collaboration en équipe.

Post-scriptum

L'invocation de services à distance concerne la façon de sauver raisonnablement un projet qui devient impossible à maintenir du goudron et d'augmenter le volume d'affaires global que le projet peut transporter. n’est pas une solution miracle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn