Maison > Article > développement back-end > Explication détaillée du code des appels à distance PHP et du framework RPC (image)
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. .
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.
À 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.
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(), '5.4.0', '<')) { curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1); } else { curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2); } curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); curl_setopt($ci, CURLOPT_HEADER, FALSE); switch ($method) { case 'POST': curl_setopt($ci, CURLOPT_POST, TRUE); if (!empty($postfields)) { curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); $this->postdata = $postfields; } break; case 'DELETE': curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); 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('SAE_ACCESSKEY') ) { $headers[] = "SaeRemoteIP: " . $this->remote_ip; } else { $headers[] = "API-RemoteIP: " . $this->remote_ip; } } else { if ( !defined('SAE_ACCESSKEY') ) {// $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR']; } } 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 '=====request info====='."\r\n"; print_r( curl_getinfo($ci) ); echo '=====response====='."\r\n"; print_r( $response ); } curl_close ($ci); return $response; }
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.
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 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.
Puisque XML est utilisé, je ne le décrirai pas beaucoup. Après tout, json est principalement utilisé.
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.
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.
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 !
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.
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!