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

はじめに

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

モジュールに分割する

この段階は一般にプロジェクトの初期段階であり、人員が不足しているため、サーバー側インターフェイスのプロジェクトは 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 までご連絡ください。
PHPはユーザーのセッションをどのように識別しますか?PHPはユーザーのセッションをどのように識別しますか?May 01, 2025 am 12:23 AM

phpidentifiesauser'ssessionsingsinssessionCookiesIds.1)whensession_start()iscalled、phpgeneratesauniquesidstoredsored incoookienadphpsessidontheuser'sbrowser.2)thisidallowsphptortorieSessiondatadata fromthata

PHPセッションを保護するためのベストプラクティスは何ですか?PHPセッションを保護するためのベストプラクティスは何ですか?May 01, 2025 am 12:22 AM

PHPセッションのセキュリティは、次の測定を通じて達成できます。1。session_regenerate_id()を使用して、ユーザーがログインまたは重要な操作である場合にセッションIDを再生します。 2. HTTPSプロトコルを介して送信セッションIDを暗号化します。 3。Session_Save_Path()を使用して、セッションデータを保存し、権限を正しく設定するためのSecure Directoryを指定します。

PHPセッションファイルはデフォルトで保存されていますか?PHPセッションファイルはデフォルトで保存されていますか?May 01, 2025 am 12:15 AM

phpsessionFilesToredInthededirectoryspecifiedBysession.save_path、通常/tmponunix-likesystemsorc:\ windows \ temponwindows.tocustomizethis:1)uesession_save_path()tosetaCustomdirectory、ensuringit'swritadistradistradistradistradistra

PHPセッションからデータをどのように取得しますか?PHPセッションからデータをどのように取得しますか?May 01, 2025 am 12:11 AM

toretrievedatafrompsession、Startthessession withsession_start()andAccessvariablesshe $ _SessionArray.forexample:1)Startthessession:session_start()

セッションを使用してショッピングカートを実装するにはどうすればよいですか?セッションを使用してショッピングカートを実装するにはどうすればよいですか?May 01, 2025 am 12:10 AM

セッションを使用して効率的なショッピングカートシステムを構築する手順には、次のものがあります。1)セッションの定義と機能を理解します。セッションは、リクエスト全体でユーザーのステータスを維持するために使用されるサーバー側のストレージメカニズムです。 2)ショッピングカートに製品を追加するなど、基本的なセッション管理を実装します。 3)製品の量管理と削除をサポートし、高度な使用状況に拡大します。 4)セッションデータを持続し、安全なセッション識別子を使用することにより、パフォーマンスとセキュリティを最適化します。

PHPでインターフェイスをどのように作成して使用しますか?PHPでインターフェイスをどのように作成して使用しますか?Apr 30, 2025 pm 03:40 PM

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

crypt()とpassword_hash()の違いは何ですか?crypt()とpassword_hash()の違いは何ですか?Apr 30, 2025 pm 03:39 PM

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

PHPのクロスサイトスクリプト(XSS)をどのように防ぐことができますか?PHPのクロスサイトスクリプト(XSS)をどのように防ぐことができますか?Apr 30, 2025 pm 03:38 PM

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境