ホームページ  >  記事  >  バックエンド開発  >  PHPリモート呼び出しとRPCフレームワークの詳細なコード説明(写真)

PHPリモート呼び出しとRPCフレームワークの詳細なコード説明(写真)

黄舟
黄舟オリジナル
2017-03-11 09:15:363268ブラウズ

はじめに

プロジェクトの開始からバージョンアップ、最終バージョンのメンテナンスまで。機能は常に増加しており、それに対応してコードの量も増加しているため、プロジェクトの保守が困難になりつつある場合、開発チームがプロジェクトをより適切に実行できるように、プロジェクトを分割する必要があります。 。

モジュールに分割する

この段階は一般にプロジェクトの初期段階であり、人員が不足しているため、サーバー側インターフェイスのプロジェクトは 1 つの開発とメンテナンスのみで行われます。開発の習慣に従って、プロジェクトはいくつかのモジュールに分割されます。開発を 1 つのプロジェクトでデプロイします。

これの欠点は、バージョンが更新されるとプロジェクトが保守できなくなることです。

サブプロジェクト

各モジュールの機能が向上し続けるにつれて、コードはさらに肥大化していきます。このとき、上図のようにプロジェクトをユーザー系プロジェクトと決済系プロジェクトに分割する必要があります。

PHPリモート呼び出しとRPCフレームワークの詳細なコード説明(写真)

CURL

最初は、誰もが CURL を使用して外部リソースにアクセスします。

たとえば、主要なサードパーティが提供する SDK など、特定の SMS プラットフォーム 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

Bird Brother が作成した 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);
?>

Brother Bird のものにはドキュメントが少なく、より多くのデバッグが必要であることに注意してください。

Thrift

thrift は、スケーラブルな言語を超えたサービスの開発に使用されるソフトウェア フレームワークです。強力なソフトウェア スタックとコード生成エンジンを組み合わせて、C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk などのプログラミング言語間で構築します。 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"}
    ]

実際、インターフェースの戻り値はこの規格に従ってクライアントに提供されていることがわかります。

同様に、サーバーのデータ受信とサーバーへの返信もこの標準に従う必要があります。

プロジェクト分割によってもたらされる変化

プロジェクトのリファインメント

1つのモジュールが1つのプロジェクトに対応し、RESTベースのインターフェース標準によりプロジェクト間でリソース指向のデータアクセスが行われます。

スタッフのニーズ

プロジェクト分割の前提は、1 つのプロジェクトでは既存の事業開発要件を満たすことができないため、分割後は開発者の数が増加することを意味します。

ゲリラから正規軍への移行!

ドキュメント

プロジェクトが増えると、インターフェイス呼び出しドキュメントも増え、チームのコラボレーション効率が向上します。

追記

サービスのリモート呼び出しとは、保守不可能になりつつあるプロジェクトをいかに合理的にタールピットから救い出し、プロジェクトが担える全体的なビジネス量を増やすかということですが、世の中に特効薬はありません。

以上がPHPリモート呼び出しとRPCフレームワークの詳細なコード説明(写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。