swoole是面向生产环境的 PHP 异步网络通信引擎,使用 c/c 编写,提供了 PHP 语言的异步多线程服务器,异步 TCP/UDP 网络客户端,异步 MySQL,异步 Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询等功能。swoole还内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
相比传统运行的PHP,swoole主要有以下特点:
1、常驻内存
传统php-fpm运行方式每处理一个请求都需要加载一遍代码至内存,请求处理完毕后销毁内存,这个处理过程在请求量大的情况下成为一大性能瓶颈。swoole没有这个问题,swoole服务在启动后,每个文件只需要加载一次,加载至内存后可多次使用,直到服务重启。
2、多进程模式
php-fpm是Master 主进程 / Worker 多进程模式,每个 Worker 进程只对应一个连接,执行完整的PHP代码,请求执行完毕,占用的内存被销毁,下一个请求会重新执行初始化等上述一系列操作。
swoole同样也是Master 主进程 / Worker 多进程模式,不过swoole底层还支持两种运行方式,一种是传统异步非阻塞的单线程Master / Worker多进程模式,这种模式代码简单,不容易出错,worker直接监听端口处理请求,由于是异步非阻塞的,单个worker可以同时处理大量的请求,跟nginx类似,这种模式没有IPC开销,性能很好;另一种模式是多线程Master/单线程Worker的多进程模式,该模式用了大量的进程间通信、进程管理机制,其中Master进程的master线程主要负责accept请求以及处理信号,reactor线程则主要负责收发数据并将数据转发给合适的worker进程处理
3、支持协程
swoole2.0就提供了协程特性,可使用协程的编程方式代替异步回调,应用层可以使用完全同步的编程方式,底层自动实现异步IO,这极大的方便了开发者进行异步编程,避免了传统异步回调带来的多层回调以及代码逻辑离散等问题。
swoole4.0 更是实现了stackful协程,使用了php c的双栈模式,使swoole协程支持了php所有语法,不仅如此,swoole4.1.0 在底层增加了一个新特性,可以在运行时动态将基于php_stream实现的扩展、PHP网络客户端代码一键协程化,底层替换了ZendVM Stream的函数指针,所有使用php_stream进行socket操作均变成协程调度的异步IO。
php7 swoole4与nginx性能对比
swoole采用单线程swoole_base模式,启动4个worker进程,nginx同样启动4个worker进程,输出hello word,测试环境为4C 8G云服务器,压测工具为apache bench,ab -c 100 -n 10000 http://xxxx,压测结果如下:
php-7 swoole4
nginx
从上面压测结果可以看出,swoole和nginx的QPS相差不大,swoole甚至有微小的胜出,足见swoole性能的强劲