自定义事件式方案
承诺/推迟
高阶函数修正改局部函数
协程(发电机)
Swoole是PHP语言的高级网络通信框架,提供了PHP语言的异步多线程服务器。swoole采用自定义事件样式方案,为我们提供网络层基本封装。基于swoole,可以扩展出业务层的模拟开发框架。tsf(腾讯服务器框架)是腾讯公司推出的PHP协程方案,基于Swoole+PHPGenerator实现的协程。该框架使用协程模式,基于swoole与swoole框架开发。实现了真正的异步非多重开发模式,同时具有极高的性能。其核心代码来源于该文章协同多任务处理使用协同程序(在PHP中!)。TSF使用了较为复杂的用户态任务调度逻辑,在腾讯的OpenAPI中使用。另外由于使用了swoole框架,略显重量级。该类实现了基本的然后的方法,并通过对Promise流程的延迟计算,保证了流程的动态控制能力。该框架是一个非常基础的Web框架。,目前仅实现通用Future(通用延迟计算),HttpClientFuture,ResponseFuture三个连续计算类。该框架需要配合Swoole master版本使用,编译参数。/configure--enable-async-httpclient,开启初始化httpclient。演示代码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字段中。如果获取到了数据,再获取haha2这个用户的信息,写入上下文user2字段中。并将user2的body字段放入user3字段中。然后获取haha4和haha5的信息。最后将所有数据输出到网页。
可以看到,在第一个then中,通过if条件返回promise对象,实现了对异步流程的动态控制。同样的,整个流程通过then串联起来,已经较为接近同步代码的书写了。而使用回调的方式,代码会变得极为恐怖。
并行请求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两个用户的数据,分布放到user1和user2两个字段中。
存在问题其中Handler_Sync实现的就是该框架同步的使用方式。另外,目前reject方法以及异常处理流程均没有实现,有兴趣的朋友可以自行扩展。
目前有一个比较严重的bug,如果大量httprequest没有完成就自行中断的话,会导致swoolehttpserver发生错误,从而退出。在swoole前面放一个nginx就可以解决问题。
测试方法启动
php run.php测试:
ab -n 10000 -c 100 "https://localhost:9502/async"ab -n 10000 -c 100 "https://localhost:9502/sync"经过测试,在后端接口响应性能有问题的情况下,swPromise可以同时处理大量连接,用很低的cpu负载等待接口数据返回。
评论