swPromise PHP纯异步非阻塞框架开源项目

我要开发同款
匿名用户2015年11月18日
121阅读

技术信息

开源地址
https://github.com/coooold/swPromise
授权协议
MIT

作品详情

swPromise,基于swoole的PHPpromise框架

一个业务请求可能会串行的请求多个接口A->B->C,此时如果接口B的响应时间较慢(关键性业务,需要有预先准备好的超时等待时间),并导致请求整体的时间过长,严重降低系统的响应能力。考虑到这个业务场景下,进展的主要时间用在等待网络io返回。的方式,逐渐极大的提升服务的爆炸(NodeJS的优势)。

如果某接口响应时间超过往常,会导致php-fpm过程数急剧上升,从而导致大量cpu资源浪费在进程调度上面,甚至导致服务崩溃。swPromise框架是为了解决该问题而开发的。

传统上,为进行初始化调用,会在代码中实现大量的替换函数,导致代码发生性与可维护性的急剧下降。为了解决这个问题,主流方案有以下几种:

自定义事件式方案

承诺/推迟

高阶函数修正改局部函数

协程(发电机)

Swoole是PHP语言的高级网络通信框架,提供了PHP语言的异步多线程服务器。swoole采用自定义事件样式方案,为我们提供网络层基本封装。基于swoole,可以扩展出业务层的模拟开发框架。

tsf(腾讯服务器框架)是腾讯公司推出的PHP协程方案,基于Swoole+PHPGeerator实现的协程。该框架使用协程模式,基于swoole与swoole框架开发。实现了真正的异步非多重开发模式,同时具有极高的性能。其核心代码来源于该文章协同多任务处理使用协同程序(在PHP中!)。TSF使用了较为复杂的用户态任务调度逻辑,在腾讯的OpeAPI中使用。另外由于使用了swoole框架,略显重量级。

该类实现了基本的然后的方法,并通过对Promise流程的延迟计算,保证了流程的动态控制能力。该框架是一个非常基础的Web框架。,目前仅实现通用Future(通用延迟计算),HttpClietFuture,ResposeFuture三个连续计算类。

该框架需要配合Swoole master版本使用,编译参数。/cofigure--eable-asyc-httpcliet,开启初始化httpcliet。

演示代码class Hadler_Idex exteds \Core\Hadler{    public fuctio ru($request, $respose){        Promise::create ( Model::getUserIfo ( 'user1', 'haha' ) )            ->the (fuctio(&$promise){                $user1 = $promise->get('user1');                if($user1){                    retur Model::getUserIfo ( 'user2', 'haha2' )                            ->the(fuctio(&$promise){                                $user2 = $promise->get('user2');                                $promise->accept(['user3'=>$user2['body']]);                            });                }                else $promise->accept();            })            ->the ( Model::getUserIfo ( 'user4', 'haha4' ) )            ->the ( Model::getUserIfo ( 'user5', 'haha5' ) )            ->the ( ew ResposeFuture ($respose) )            ->start ( ew PromiseCotext () );    }}

这段流程表明了,先获取haha这个用户的信息,写入上下文的user1字段中。如果获取到了数据,再获取haha2这个用户的信息,写入上下文user2字段中。并将user2的body字段放入user3字段中。然后获取haha4和haha5的信息。最后将所有数据输出到网页。

可以看到,在第一个the中,通过if条件返回promise对象,实现了对异步流程的动态控制。同样的,整个流程通过the串联起来,已经较为接近同步代码的书写了。而使用回调的方式,代码会变得极为恐怖。

并行请求class Hadler_Idex exteds \Core\Hadler{    public fuctio ru($request, $respose){        Promise::create([            Model::getUserIfo ( 'user1', 'haha' ),            Model::getUserIfo ( 'user2', 'haha2' ),        ])->the(            ew ResposeFuture ($respose)        )->start(ew PromiseCotext ());    }}

这个请求并行获得haha与hah2两个用户的数据,分布放到user1和user2两个字段中。

存在问题

其中Hadler_Syc实现的就是该框架同步的使用方式。另外,目前reject方法以及异常处理流程均没有实现,有兴趣的朋友可以自行扩展。

目前有一个比较严重的bug,如果大量httprequest没有完成就自行中断的话,会导致swoolehttpserver发生错误,从而退出。在swoole前面放一个gix就可以解决问题。

测试方法

启动

php ru.php

测试:

ab - 10000 -c 100 "https://localhost:9502/asyc"ab - 10000 -c 100 "https://localhost:9502/syc"

经过测试,在后端接口响应性能有问题的情况下,swPromise可以同时处理大量连接,用很低的cpu负载等待接口数据返回。

功能介绍

swPromise,基于swoole的PHP promise框架 一个业务请求可能会串行的请求多个接口A-> B-> C,此时如果接口B的响应时间较慢(关键性业务,需要有预先准备好的超时等待时间...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论