国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 > php教程 > php手冊 > 正文

Yar – 并行的RPC框架(Concurrent RPC framework)

不言
發(fā)布: 2018-05-23 14:53:48
原創(chuàng)
2115人瀏覽過

作者: Laruence( ) 本文地址: http://www.laruence.com/2012/09/15/2779.html 轉(zhuǎn)載請注明出處 Yar(yet another RPC framework, 教主問我為啥都是Ya打頭, 呵呵, 因為這樣名字好起)是我在3個多月前, 為了解決一個實際的問題, 而開發(fā)的一個PHP擴展的, RPC框架,

yar(yet another rpc framework, 教主問我為啥都是ya打頭, 呵呵, 因為這樣名字好起)是我在3個多月前, 為了解決一個實際的問題, 而開發(fā)的一個php擴展的, rpc框架, 和現(xiàn)有的rpc框架(xml-rpc, soap)不同, 這是一個輕量級的框架, 支持多種打包協(xié)議(msgpack, json, php), ?并且最重要的一個特點是, 它是可并行化的..

考慮如下的場景:

傳統(tǒng)的Web應用, 一個進程, 一個請求, 天經(jīng)地義. ?然而, 當一個請求的處理中, ?涉及到多出數(shù)據(jù)源, 并且他們之間具有一定的不依賴性.

還是傳統(tǒng)的Web應用, 一個應用隨著業(yè)務快速增長, 開發(fā)人員的流轉(zhuǎn), 就會慢慢的進入一個惡性循環(huán), ?代碼量上只有加法沒有了減法. ?因為隨著系統(tǒng)變復雜, 牽一發(fā)就會動全局, ?而新來的維護者, 對原有的體系并沒有那么多時間給他讓他全面掌握. 即使有這么多時間, 要想掌握以前那么多的維護者的思維的結(jié)合, 也不是一件容易的事情…

那么, 長次以往, 這個系統(tǒng)將會越來越不可維護…. ?到一個大型應用進入這個惡性循環(huán), 那么等待他的只有重構(gòu)了.

那么, 能不能對這個系統(tǒng)做解耦呢?

我們已經(jīng)做了很多解耦了, 數(shù)據(jù), 中間件, 業(yè)務, 邏輯, 等等, 各種分層. 但到Web應用這塊, 還能怎么分呢, MVC我們已經(jīng)做過了….

基于此, Yar或許能解決你遇到的這倆個問題…

Yar是一個非常輕量級的RPC框架, 我在實現(xiàn)Yar的時候, 追求了極致的輕量級, 它使用非常簡單, 對于Server端:

<?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();
?>
登錄后復制

和Soap使用方法很相像吧? 是的, 就這樣, 你的API類就可以對外提供服務了..

Yar為了方便開發(fā), 把文檔和接口綁定到了一起, ?對于上面的例子, 如果我們是簡單的GET請求這個接口地址的話, 我們就會看到如下的信息頁面:

這樣, 我們可以在注釋中,把接口的信息標注好, 就可以讓文檔和接口在一起了.

而對于Client端來說, 簡單的串行調(diào)用, 會非常之簡單:

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

這樣一來, ?如果你有多個服務, 你只需要一個client.

那么, 最激動人心的并行化調(diào)用呢?

<?php
function callback($retval, $callinfo) {
     var_dump($retval);
}

Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::loop(); //send
?>
登錄后復制

這樣, 所有的請求會一次發(fā)出, ?只要有任何一個請求完成, ?回調(diào)函數(shù)”callback”就會被立即調(diào)用.

這里還有一個細節(jié), Yar見縫插針的不會浪費任何時間, ?在這些請求發(fā)送完成以后, Yar會調(diào)用一次callback, 和普通的請求返回回調(diào)不同, 這次的調(diào)用的$callinfo參數(shù)為空.

這樣一來, 我們就可以先發(fā)送請求, 然后再第一次回調(diào), 繼續(xù)做我們當前進程的工作, 等所有工作結(jié)束以后, 再交給Yar去獲取并行RPC的響應.

<?php
function callback($retval, $callinfo) {
    if ($callinfo == NULL) {
       //做本地的邏輯
       return TRUE;
    }

     //RPC請求返回, 返回值在$retval
}
登錄后復制

有了這些, 我們就可以把一個Web應用中, 多個數(shù)據(jù)源并行處理, 從而也能把這些邏輯解耦, 分開部署…

當然Yar目前還在試用階段, 所以還沒有發(fā)布任何一個包(Yar at PECL), ?但是有興趣的同學可以現(xiàn)在就把代碼clone下去試用哦(雖然沒有正式投入試用, 不過已經(jīng)經(jīng)過了驗證).

Yar: Yar at Github

PS, 如果要使用Msgpack(一個高效的二進制打包協(xié)議)做為打包協(xié)議, 需要單獨安裝Msgpack擴展(Msgpack), 這個擴展目前也是我在維護, 我會在近幾天把他在PECL上發(fā)布, 盡請期待.

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
作者最新文章
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關(guān)注服務號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號