# 导言 [TOC] * [用户案例](用户案例.md) * [基于Swoole扩展分布式全栈开发框架](ji-yu-swoole-kuo-zhan-gao-xing-neng-gao-bing-fa-de-php-tong-xun-kuang-jia.md) PHP是一种被广泛应用的开源脚本语言,绝大多数开发者使用PHP做基于Web的应用程序,并且有了很多非常知名的Web框架。 传统的PHP应用程序基本上是在Apache等Web容器中运行的,浏览器与Web容器采用HTTP协议通信,然而在很多实际项目中HTTP协议无法满足我们的需求,尤其是在服务端和客户端要保持长连接,做实时双向通讯时,HTTP协议显得力不从心。例如即时IM通讯,游戏服务器通讯,与硬件传感器通讯等等,开发这些应用程序我们无法直接使用nginx/apache + PHP来实现。 Swoole扩展的出现使我们重新定义的PHP,我们通过Swoole扩展可以几乎做我们想做的任何事情,如基于Websocket的服务器、游戏服务器、移动通讯服务器、智能家居服务端、物联网服务、web服务器、RPC服务器等等。几乎任何基于TCP/UDP通讯的服务端都可以用PHP来开发。Swoole扩展使得开发者摆脱PHP只能用于Web开发的束缚,向更广阔的前景发展。 但是强大的Swoole并不那么容易使用,他作为一个扩展来说无一例外是强大的,优异的性能,丰富的Api,如何更容易的使用Swoole带来的性能和新特性,框架就要出来解决这一矛盾。 SwooleDistributed框架采用了MVC结构,他的一些灵感来自于CI框架,你们在使用的过程中会发现不少CI的影子,这使得我们使用过CI的开发者更容易上手。并且框架针对swoole的api进行了再次封装,在保证高性能的同时提供了高效率开发。 ## 支持投递任务 针对swoole提供的Task进行了再次封装,Controller,Model中调用Task只需要一句话。 Task是swoole扩展中task的封装,在SwooleDistributed可以非常方便的进行异步(同步)任务投递。 ## 定时器 定时器更容易使用,只需要更改配置随心所遇的调用Model或者Task的Api。 ## 协程 不再需要复杂难看的回调,通过yield简化客户端代码。 PS:swoole2.0开始提供了协程,但是支持的并不完整比如task就没有实现协程模式,稳定性也没有1.9.x的稳定,框架目前使用的还是1.9.x版本。 ##托管同步异步 框架统一了同步与异步Redis/Mysql调用的API和返回格式,也就是说开发者不用自己选择使用同步还是异步,一切交给框架就行。 PS:这里带来的好处就是Task和Model的代码可以互相调用了。 ## 单元测试 框架提供了一个类似PHPUNIT的单元测试模块。 ## 连接池 异步Redis和异步Mysql的连接池不需要开发者维护,你们只需要使用就行。 SwooleDistributed借助Miner实现了Mysql的语法构建器。 Miner的用法:[Miner](https://github.com/jstayton/Miner) 另外SwooleDistributed率先支持异步Mysql事务。 ## 支持分布式系统 SwooleDistributed搭载dispatch组件实现分布式部署,俩者均是可以集群部署无单点故障。 ## 单服务多协议 SwooleDistributed服务器通过配置不同的端口,可以同时处理tcp和http请求,比如开放http api实现给所有tcp的客户端广播消息这种需求在SwooleDistributed中实现起来非常简单。tcp和http请求通过自定义路由器可以指向同一个controller,再通过设置tcp,http方法的前缀可以分离tcp和http的处理方法。 ## 支持全局广播或者向任意客户端推送数据 SwooleDistributed提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合定时任务,也可以定时推送数据。 ## 支持模板引擎 SwooleDistributed的模板引擎采用了plates。 plates的文档:[plates](http://platesphp.com/) ## 高并发,高性能,低配置 SwooleDistributed使用了swoole的扩展,内部的controller和model采用了对象池的模式,对象重用性能强悍。 SwooleDistributed和dispatch实现了内网自动发现,集群部署零配置。 ## 支持服务平滑重启 当需要重启服务时(例如发布版本),我们不希望正在处理用户请求的进程被立刻终止,更不希望重启的那一刻导致客户端通讯失败。框架提供了平滑重启功能,能够保障服务平滑升级,不影响客户端的使用。 ## 支持文件更新检测及自动加载 在开发过程中,我们希望在我们改动代码后能够立刻生效,以便查看结果。框架提供了文件检测及自动加载组件,只要文件有更新,框架会自动运行reload,以便加载新的文件,使之生效。 # SD2概述 保留1.x版本所有功能的支持,2.x版本主要增加了对微服务化的支持,和协程性能的改善。 使用SD框架,无论是1.x用户还是2.x用户都可以轻松的将代码进行微服务化,需要改动的代码相当少,拆分Controller,理清服务间的依赖关系,就可以实现微服务化。 协程的性能在新版本上也有所提高,首先是qps直接提升了30%,其次是框架内部完全使用了对象池技术,减少了GC的次数内存占用率极小,除了压测暴涨的连接导致内存峰值外基本无明显波动。 SD间专用的RPC方案,tcpClient,HttpClient连接池技术等等崭新的模块超高的性能,让你的开发更加简单。 SD2将内部使用的连接池,协程,对象池等技术全部重新构建,分包更加清晰,模块间解耦使得可以独立使用,如果你想单独开发自己的框架又不想踩坑,那么可以使用这些模块包。 还有很多细小的功能,如支持Redis lua,框架会自动上传lua脚本,graylog的支持将日志数据发往graylog服务器,钉钉机器人的支持,用于告警系统的搭建,支持docker,mqtt异步客户端等等 总之,SD2是一个新的开始,它将探索微服务的美妙世界。