1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        swPromisePHP純異步非阻塞框架

        聯(lián)合創(chuàng)作 · 2023-09-29 12:36

        swPromise,基于swoole的PHP promise框架

        一個業(yè)務請求可能會串行的請求多個接口A-> B-> C,此時如果接口B的響應時間較慢(關鍵性業(yè)務,需要有預先準備好的超時等待時間),并導致請求整體的時間過長,嚴重降低系統(tǒng)的響應能力??紤]到這個業(yè)務場景下,進展的主要時間用在等待網(wǎng)絡io返回。的方式,逐漸極大的提升服務的爆炸(NodeJS的優(yōu)勢)。

        如果某接口響應時間超過往常,會導致php-fpm過程數(shù)急劇上升,從而導致大量cpu資源浪費在進程調度上面,甚至導致服務崩潰。swPromise框架是為了解決該問題而開發(fā)的。

        傳統(tǒng)上,為進行初始化調用,會在代碼中實現(xiàn)大量的替換函數(shù),導致代碼發(fā)生性與可維護性的急劇下降。為了解決這個問題,主流方案有以下幾種:

        • 自定義事件式方案

        • 承諾/推遲

        • 高階函數(shù)修正改局部函數(shù)

        • 協(xié)程(發(fā)電機)

        Swoole是PHP語言的高級網(wǎng)絡通信框架,提供了PHP語言的異步多線程服務器。swoole采用自定義事件樣式方案,為我們提供網(wǎng)絡層基本封裝?;趕woole,可以擴展出業(yè)務層的模擬開發(fā)框架。

        tsf(騰訊服務器框架)是騰訊公司推出的PHP協(xié)程方案,基于Swoole + PHP Generator實現(xiàn)的協(xié)程。該框架使用協(xié)程模式,基于swoole與swoole框架開發(fā)。實現(xiàn)了真正的異步非多重開發(fā)模式,同時具有極高的性能。其核心代碼來源于該文章協(xié)同多任務處理使用協(xié)同程序(在PHP中?。?/a>。TSF使用了較為復雜的用戶態(tài)任務調度邏輯,在騰訊的OpenAPI中使用。另外由于使用了swoole框架,略顯重量級。

        該類實現(xiàn)了基本的然后的方法,并通過對Promise流程的延遲計算,保證了流程的動態(tài)控制能力。該框架是一個非常基礎的Web框架。 ,目前僅實現(xiàn)通用Future(通用延遲計算),HttpClientFuture,ResponseFuture三個連續(xù)計算類。

        該框架需要配合Swoole master版本使用,編譯參數(shù)。/configure--enable-async-httpclient,開啟初始化http client。

        演示代碼

        class Handler_Index extends \Core\Handler{
            public function run($request, $response){
                Promise::create ( Model::getUserInfo ( 'user1', 'haha' ) )
                    ->then (function(&$promise){
                        $user1 = $promise->get('user1');
                        if($user1){
                            return Model::getUserInfo ( 'user2', 'haha2' )
                                    ->then(function(&$promise){
                                        $user2 = $promise->get('user2');
                                        $promise->accept(['user3'=>$user2['body']]);
                                    });
                        }
                        else $promise->accept();
                    })
                    ->then ( Model::getUserInfo ( 'user4', 'haha4' ) )
                    ->then ( Model::getUserInfo ( 'user5', 'haha5' ) )
                    ->then ( new ResponseFuture ($response) )
                    ->start ( new PromiseContext () );
            }
        }

        這段流程表明了,先獲取haha這個用戶的信息,寫入上下文的user1字段中。 如果獲取到了數(shù)據(jù),再獲取haha2這個用戶的信息,寫入上下文user2字段中。 并將user2的body字段放入user3字段中。然后獲取haha4和haha5的信息。 最后將所有數(shù)據(jù)輸出到網(wǎng)頁。

        可以看到,在第一個then中,通過if條件返回promise對象,實現(xiàn)了對異步流程的動態(tài)控制。 同樣的,整個流程通過then串聯(lián)起來,已經(jīng)較為接近同步代碼的書寫了。 而使用回調的方式,代碼會變得極為恐怖。

        并行請求

        class Handler_Index extends \Core\Handler{
            public function run($request, $response){
                Promise::create([
                    Model::getUserInfo ( 'user1', 'haha' ),
                    Model::getUserInfo ( 'user2', 'haha2' ),
                ])->then(
                    new ResponseFuture ($response)
                )->start(new PromiseContext ());
            }
        }

        這個請求并行獲得haha與hah2兩個用戶的數(shù)據(jù),分布放到user1和user2兩個字段中。

        存在問題

        其中Handler_Sync實現(xiàn)的就是該框架同步的使用方式。 另外,目前reject方法以及異常處理流程均沒有實現(xiàn),有興趣的朋友可以自行擴展。

        目前有一個比較嚴重的bug,如果大量http request沒有完成就自行中斷的話,會導致swoole http server發(fā)生錯誤,從而退出。在swoole前面放一個nginx就可以解決問題。

        測試方法

        啟動

        php run.php

        測試:

        ab -n 10000 -c 100 "http://localhost:9502/async"
        ab -n 10000 -c 100 "http://localhost:9502/sync"

        經(jīng)過測試,在后端接口響應性能有問題的情況下,swPromise 可以同時處理大量連接,用很低的 cpu 負載等待接口數(shù)據(jù)返回。

        瀏覽 20
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            爱爱爱爽爽爽 | 亚洲第一网站 | 少妇精品高潮7777 | a久久 | 黄色日逼视频 | 亚洲三级电影在线观看 | 妈妈你真棒插曲快来救救我电影蜜桃 | 国产中文字幕91 | 啊轻点灬大巴太粗太长了军人 | 国产精品偷窥熟女精品图片 |