最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP遠(yuǎn)程調(diào)用以及RPC框架

 更新時間:2021年04月20日 14:20:56   作者:雨果蝦滑  
這篇文章主要介紹了PHP遠(yuǎn)程調(diào)用以及RPC框架,對遠(yuǎn)程調(diào)用感興趣的同學(xué),可以參考下

前言

一個項目,從開始到版本更新,一直到最后的版本維護。功能在不斷增多,對應(yīng)的代碼量也在不斷增加,也就意味著項目變得更不可維護,這時候,我們需要用拆分的方式將一個項目打散,以便開發(fā)團隊更好的對項目進行維護。

分模塊

這個階段,一般也是項目的初級階段,由于人手不夠,一個服務(wù)端的接口項目只有一個開發(fā)進行維護,根據(jù)開發(fā)的習(xí)慣,會把項目分成若干個模塊進行開發(fā),在一個項目下進行部署。

這樣做的缺點在于項目會隨著版本更新而變得不可維護。

分項目

隨著每個模塊功能的不斷完善,代碼變得更加臃腫。這時候需要對項目進行拆分,比如上面的圖,分成用戶體系項目、支付體系項目。

CURL

開始大家會采用CURL的方式對外部資源進行訪問。

比如某短信平臺SDK,比如各大第三方提供的SDK,糾結(jié)到源碼發(fā)現(xiàn)都是直接采用CURL函數(shù)的方式進行訪問。

優(yōu)點在于沒有環(huán)境要求,能直接用。
缺點在于并發(fā)訪問的資源占用問題。

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

RPC

遠(yuǎn)程過程調(diào)用協(xié)議

RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。

RPC采用客戶機/服務(wù)器模式。請求程序就是一個客戶機,而服務(wù)提供程序就是一個服務(wù)器。首先,客戶機調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務(wù)進程,然后等待應(yīng)答信息。在服務(wù)器端,進程保持睡眠狀態(tài)直到調(diào)用信息到達為止。當(dāng)一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進程接收答復(fù)信息,獲得進程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進行。

Yar

鳥哥出品的RPC框架,輕量級框架。

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

調(diào)用代碼

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

注意的是鳥哥出的東西文檔比較少,需要多調(diào)試。

Thrift

thrift是一個軟件框架,用來進行可擴展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù)。

遠(yuǎn)程調(diào)用的意義在于,不同的子項目可以用更適合自己的語言來解決,更有效率的實現(xiàn)需求。

同時,對團隊的開發(fā)來講,更能提高整體的技術(shù)水平。

SOAP

由于用的XML就不多描述了,畢竟還是json用的多。

JSON-RPC

下面是返回值的標(biāo)準(zhǔn)

--> [

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

    ]

實際上你會發(fā)現(xiàn)我們在給客戶端提供接口的返回值,就是按照這個標(biāo)準(zhǔn)來做的。

相應(yīng)的,服務(wù)端對服務(wù)端的數(shù)據(jù)接收和返回,也要同樣按照這個標(biāo)準(zhǔn)來做。

項目拆分帶來的變化

項目細(xì)化

一個模塊對應(yīng)一個項目,項目之間通過基于REST的接口標(biāo)準(zhǔn)進行面向資源的數(shù)據(jù)訪問。

人員需求

項目拆分的前提是一個項目不足以滿足現(xiàn)有的業(yè)務(wù)發(fā)展要求,也就意味著拆分之后的開發(fā)人員數(shù)量的擴增。

游擊隊向正規(guī)軍編制的跨越!

文檔

更多的項目也就意味著更多的接口調(diào)用文檔,適當(dāng)?shù)奶幚砦臋n才能更好的提高團隊協(xié)作效率。

后記

服務(wù)的遠(yuǎn)程調(diào)用在于怎么合理的把一個正在變得不可維護的項目從焦油坑中解救出來,并提高項目整體能承載的業(yè)務(wù)量,不過,世界上沒有銀彈。

以上就是PHP遠(yuǎn)程調(diào)用以及RPC框架的詳細(xì)內(nèi)容,更多關(guān)于PHP遠(yuǎn)程調(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • thinkphp3.2點擊刷新生成驗證碼

    thinkphp3.2點擊刷新生成驗證碼

    這篇文章主要介紹了thinkphp3.2點擊刷新生成驗證碼的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • mysqli擴展無法在PHP7下升級問題的解決

    mysqli擴展無法在PHP7下升級問題的解決

    這篇文章主要給大家介紹了關(guān)于mysqli擴展無法在PHP7下升級問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用PHP7具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • PHP CodeIgniter框架的工作原理研究

    PHP CodeIgniter框架的工作原理研究

    這篇文章主要介紹了PHP CodeIgniter框架的工作原理研究,本文首先分析了它的工作流程,然后總結(jié)了它的工作原理,需要的朋友可以參考下
    2015-03-03
  • php使用正則驗證中文

    php使用正則驗證中文

    本文給大家分享的是使用php驗證字符串中是否有中文的方法,十分的簡單實用,有需要的小伙伴可以參考下
    2016-04-04
  • php處理斐波那契數(shù)列非遞歸方法

    php處理斐波那契數(shù)列非遞歸方法

    phpchina上有個名人叫大白菜心,經(jīng)常會拿這個事來說事。傳統(tǒng)處理會把斐波那契數(shù)列用遞歸來處理,效率慢是必然的。不過他說事說吧,居然不拿出答案來,就有點不厚道了
    2012-02-02
  • PHP中l(wèi)trim與rtrim去除左右空格及特殊字符實例

    PHP中l(wèi)trim與rtrim去除左右空格及特殊字符實例

    這篇文章主要介紹了PHP中l(wèi)trim與rtrim去除左右空格及特殊字符的用法,結(jié)合實例形式較為詳細(xì)的說明了ltrim與rtrim的定義,參數(shù)作用及去除左右空格與特殊字符的使用技巧,需要的朋友可以參考下
    2016-01-01
  • 簡單談?wù)凱HP中的Reload操作

    簡單談?wù)凱HP中的Reload操作

    通常修改了 PHP 的配置后,為了讓修改生效會執(zhí)行 reload,而不是 restart,但最近在使用Reload操作的時候發(fā)現(xiàn)了502錯誤,想著還是要重新思考這個問題。所以這篇文章主要給大家介紹了關(guān)于PHP中Reload操作的內(nèi)容,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 簡單談?wù)?php 文件鎖

    簡單談?wù)?php 文件鎖

    PHP出現(xiàn)文件鎖與mysql表鎖有大概想的用法,就是同一時間只能讓一個人操作,這樣就避免了同時有多個人操作同一文件,這樣導(dǎo)致數(shù)據(jù)丟失的情況了,下面我來給大家介紹PHP文件鎖用法。
    2017-02-02
  • PHP5中新增stdClass 內(nèi)部保留類

    PHP5中新增stdClass 內(nèi)部保留類

    stdClass類是PHP的一個內(nèi)部保留類,初始時沒有成員變量也沒成員方法,所有的魔術(shù)方法都被設(shè)置為NULL,可以使用其傳遞變量參數(shù),但是沒有可以調(diào)用的方法。
    2011-06-06
  • php安全之直接用$獲取值而不$_GET 字符轉(zhuǎn)義

    php安全之直接用$獲取值而不$_GET 字符轉(zhuǎn)義

    php安全之直接用$獲取值而不$_GET 字符轉(zhuǎn)義,需要的朋友可以參考下
    2012-06-06

最新評論

商洛市| 涞源县| 德庆县| 旬邑县| 台前县| 木兰县| 论坛| 长阳| 昂仁县| 文昌市| 浑源县| 贵定县| 西昌市| 松溪县| 喜德县| 张北县| 南阳市| 盐亭县| 横峰县| 漾濞| 进贤县| 额济纳旗| 镇远县| 大同县| 格尔木市| 临泉县| 湘潭市| 安阳县| 剑川县| 阜城县| 陇西县| 东乌| 静安区| 即墨市| 邢台市| 民丰县| 广平县| 广宁县| 济阳县| 黑河市| 柳州市|