PHP发展到现在,已经不是单纯做个Web、写写业务逻辑了,我们也可以使用 PHP 可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。可以广泛应用于互联网、移动通信、微服务、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。

在异步网络通信开发中有两个用的比较多的框架,一个是swoole,另一个是workman,这个两个有什么区别,我们下次可以再来分析,这次我们主要是对Swoole做一个基本的介绍。

Swoole是什么?

Swoole是一个PHP的C扩展,可用来开发PHP的高性能高并发TCP/UDP Server。Swoole的网络IO部分基于epoll/kqueue事件循环,是全异步非阻塞的。业务逻辑部分使用多进程同步阻塞方式来运行。这样既保证了Server能够应对高并发和大量TCP连接。又保证业务代码仍然可以简单的编写。

Swoole1.6.2之后增加了异步支持,应用程序也可以像node.js一样写异步回调。

Swoole与Node.js相比更强大,支持同步/异步、多进程并行,Swoole提供了进程生命周期管理、内存保护机制,开发者无需考虑底层细节,专注于业务逻辑和功能的开发。

Swoole底层内置了异步非阻塞、多线程的网络IO服务器。PHP程序员仅需处理事件回调即可,无需关心底层。与Nginx/Tornado/Node.js等全异步的框架不同,Swoole既支持全异步,也支持同步。

Swoole从2.0版本开始支持了内置协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。

Swoole是开源免费的自由软件,授权协议是Apache2.0。企业和开发者均可免费使用Swoole的代码,并且在Swoole之上所作的修改无需开源。

Swoole要求使用者必须具备一定的Linux/Unix环境编程基础。

下面有几个Swoole的模块介绍:

Server

强大的TCP/UDP Server框架,支持多线程,EventLoop,事件驱动,异步,Worker进程组,Task异步任务,毫秒定时器,SSL/TLS隧道加密。

Http\Server是Server的子类,内置了Http的支持

WebSocket\Server是Http\Server的子类,内置了WebSocket的支持

Redis\Server是Server的子类,内置了Redis服务器端协议的支持

子类可以调用父类的所有方法和属性

Client

TCP/UDP/UnixSocket客户端,支持IPv4/IPv6,支持SSL/TLS隧道加密,支持SSL双向证书,支持同步并发调用,支持异步事件驱动编程。

Event

EventLoop API,让用户可以直接操作底层的事件循环,将socket,stream,管道等Linux文件加入到事件循环中。

eventloop接口仅可用于socket类型的文件描述符,不能用于磁盘文件读写

Async

异步IO接口,提供了 异步文件系统IO,定时器,异步DNS查询,异步MySQL等API,异步Http客户端,异步Redis客户端。

Timer:异步毫秒定时器,可以实现间隔时间或一次性的定时任务

swoole_async_read/swoole_async_write 文件系统操作的异步接口

异步回调API在4.4版本中已废弃

Coroutine

Swoole在2.0开始内置协程(Coroutine)的能力,提供了具备协程能力IO接口(统一在命名空间Swoole\Coroutine\*)。

协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。Swoole可以为每一个请求创建对应的协程,根据IO的状态来合理的调度协程,这会带来了以下优势:

开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。

Process

进程管理模块,可以方便的创建子进程,进程间通信,进程管理。

Buffer

强大的内存区管理工具,像C一样进行指针计算,又无需关心内存的申请和释放,而且不用担心内存越界,底层全部做好了。

Table

基于共享内存和自旋锁实现的超高性能内存表。彻底解决线程,进程间数据共享,加锁同步等问题。

Table的性能可以达到单线程每秒读写200W次


Swoole用户与案例

腾讯

QQ公众号

腾讯生活服务号(QQ公众号)的业务逻辑层基本都是基于swoole开发完成。

营销QQ

Swoole在营销QQ项目中也得到了大量应用,如:增强版的消息网管server(tcp), 业务逻辑server(udp)。

百度

百度地图

百度地图:http://map.baidu.com/

采用swoole+redis,基于swoole扩展,根据内部的需求,封装了一套可扩展、高性的PHP server,已应用于多个业务模块,提供高并发的kv数据查询及业务数据的在线计算,每天亿级的PV量

百度订单中心

作为百度统一的订单中心,承担着百度各业务线订单数据的归集、存储、挖掘、分析等工作,旨在向各业务线提供用户完整的订单数据;并以数据产品的形态,向各业务线提供基于用户消费行为的运营工具和相关报告。

边锋网络

战旗直播:http://www.zhanqi.tv

战旗直播从单个laravel应用在高并发下经常502,后来用swoole + phalcon异步服务化架构重构,实现高可扩展及可用性,每天几亿级Hits。

虎牙直播

虎牙直播:http://www.huya.com

虎牙直播APP基于Swoole实现了TCP长连接PUSH服务,日均活跃200万用户。TCP并发连接数超过40万,收发消息数峰值超过10万条每秒。

YY语音

部门内多款移动APP使用swoole作为底层框架,实现了手机客户端与服务器段长连接,直接通信的模式。大大提升了移动网络下应用程序的用户体验。