参考资料
PHP没有像Python的Twisted、Tornado,Java的Netty、Mina,JavaScript的Node.js框架,它无法实现异步网络通信程序。而Swoole扩展就是为了弥补这个缺陷而诞生的开源项目。
Swoole和Node.js非常相似,不同的是Swoole在并行提供了底层支持。Node.js是一个单线程单进程的程序,在多核服务器上无法发挥全部CPU核的计算能力。需要程序员自行使用child_process/cluster
扩展或启动多实例,使程序能够利用到多核优势。而Swoole在底层就支持了多线程/多进程,程序启动后就会创建多个IO线程和多个Worker进程。开发人员仅需要配置线程/线程数量即可。
Swoole是什么?
Swoole是PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供PHP语言的异步多线程服务器,异步TCP/UDP网络客户端、异步MySQL、异步Redis、数据库连接池、AsyncTask、消息队列、毫秒定时器、异步文件读写、异步DNS查询等。Swoole内置HTTP/WebSocket服务端/客户端、HTTP2.0服务器端。
Swoole是PHP的C扩展,可用来开发PHP的高性能高并发TCP/UDP服务器,Swoole的网络IO基于epoll/kqueue事件循环,是全异步非堵塞的。业务逻辑部分使用多进程同步阻塞方式来运行。即保证了Server能够应对高并发和大量TCP连接,又保证业务代码仍然可以简单的编写。
- Swoole是PHP的协程高性能网络通信引擎,使用C/C++编写,提供多种通信协议的网络服务器和客户端模块。
- Swoole支持完整的协程编程模式,可使用完全同步的代码实现异步程序。PHP代码无需额外添加任何关键词,底层自动进行协程调度,实现异步IO。
- Swoole协程仅支持PHP7,无法在PHP5中使用。
- Swoole提供对异步IO的支持
- Swoole为PHP多进程的模式设计了多个并发数据结构和IPC通信机制,大大简化多进程并发编程的工作。其中包括并发原子计数器、并发HashTable、Channel、Lock、进程间通信IPC等丰富的功能。
- Swoole虽然是标准的PHP扩展,与普通扩展不同的是,普通扩展只是提供了一个库函数,而Swoole扩展在运行后会接管PHP的控制权,进入事件循环。当IO事件发生后,Swoole会自动回调指定的PHP函数。
Swoole相比Apache和PHP-FPM,主要节省了PHP框架和全局对象每次请求创建和销毁带来的性能损耗,但如果PHP代码是裸echo
的方式,Swoole框架并没有性能优势。
Swoole能做什么呢?
- 异步多线程服务器及客户端
- 异步MySQL
- 异步Redis
- 数据库连接池
- 任务队列
- HTTP/WebSocket服务器与客户端
- 异步文件读写
- Swoole2.0支持协程
简单来说,Swoole可以使PHP开发人员编写高性能的异步并发TCP、UDP、UnixSocket、HTTP、WebSocket服务。
为什么要使用Swoole?
Swoole作为PHP的扩展,其核心目的是为了解决PHP在实现Server服务器开发中遇到的一系列问题,这些问题源于PHP自身执行效率上。所以在服务器开发中,一般不会使用PHP来解决问题,所以才有了Swoole重新定义了PHP的说法。
- 常驻内存,避免重复再带来的性能损耗,提升海量性能。
传统的PHP框架,在每次处理请求时,都要做一遍加载框架文件、配置等操作。这可能已经成为性能问题的一大原因,而使用Swoole则没有这个问题,它可以一次加载多次使用。
- 协程异步,提高对I/O密集型场景并发处理能力。
说到协程就必须先说说进程和线程,总所周知,进程是很占用资源的,为了处理请求大量创建进程肯定是得不偿失的。而多线程应用就比较多了,在CPU层面有几个核心就会执行几个任务,线程一旦创建就多了,自然会存在线程调度的损耗。
而协程是在单线程基础上实现的,可以最大限度利用CPU资源,而不会在I/O等待时白白浪费CPU。当然协程越多占用的内存也就越多,不过这个是可以接收的。相比进程和线程,占用的资源是相对比较少的。
使用协程时,如果遇到文件读写、请求接口等场景,会自动挂起协程,把CPU让给其它协程执行任务,这样可以提升单线程的CPU资源利用率,减少浪费从而提高性能。
- 方便地开发HTTP、TCP、UDP、WebSocket等应用,可以与硬件通信。
- PHP高性能微服务架构
Swoole的特点
- Accept线程解决Accept性能瓶颈和惊群问题
- 多IO线程更多地利用多核
- 提供全异步和半同步半异步模式
- 处理高并发IO的部分采用异步模式
- 复杂的业务逻辑部分采用同步模式
- 底层支持遍历所有连接、互发数据、自动合并拆分数据包、数据发送原子性。
Swoole和Workman有什么异同点?
目前,PHP通信服务框架最为流行的是Swoole和Workerman,Swoole是使用C语言开发的PHP的扩展类,而Workman则是使用纯PHP开发的。Swoole是使用C语言开发的PHP扩展,由于有着C语言的优势,Swoole在内存管理、数据结构、通信协议解析上明显优于Workerman,而且Swoole在目前通信协议上提供了更高级的通信功能。所以Workerman能开发的Swoole都可以,而且功能更多速度更快。同样Swoole的缺点也很明显,不能根据自己需要开发,而且需要了解底层通信服务开发。