NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# swoole_server的3种运行模式介绍 ### 一、Base模式 这种模式就是传统的异步非阻塞Server。在Reactor内直接回调PHP的函数。如果回调函数中有阻塞操作会导致Server退化为同步模式。worker_num参数对与BASE模式仍然有效,swoole会启动多个Reactor进程。 > BASE模式下reactor和worker是同一个角色 **BASE模式的优点:** - BASE模式没有IPC开销,性能更好 - BASE模式代码更简单,不容易出错 **BASE模式的缺点:** - TCP连接是在worker进程中维持的,所以当某个worker进程挂掉时,此worker内的所有连接都将被关闭 - worker进程中fd是可以重复的,所以不存在唯一标识符。不同worker的TCP连接之间无法通信 - 少量TCP长连接无法利用到所有Worker进程 **BASE模式的适用场景:** 如果客户端连接之间不需要交互,可以使用BASE模式。如Memcache、Http服务器等。 ### 二、线程模式 这个就是多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker线程去处理。Swoole提供了可配置的参数,以实现m/n的参数调整。在这种模式下onReceive可以有适度的阻塞操作。多线程模式比进程模式轻量一些,而且线程之间可以共享堆栈和资源。 访问共享内存时会有同步问题,需要使用Swoole提供的锁机制来保护数据。目前已经提供了Mutex、读写锁、文件锁、信号量、自旋锁一共5种锁的实现。 **多线程的优点:** - 对象和变量是共享的,可直接进行操作 - 文件描述符是共享的,不同的线程可以对同一个资源直接进行操作 **多线程的缺点:** - 操作非局部变量时需要加锁,编程难度高 - 一个线程发生内存错误,整个进程会全部结束 > 由于PHP的ZendVM在多线程模式存在内存错误,多线程模式在v1.6.0版本后已关闭 ### 三、进程模式 多进程模式是最复杂的方式,用了大量的进程间通信、进程管理机制。适合业务逻辑非常复杂的场景。Swoole提供了完善的进程管理、内存保护机制。在业务逻辑非常复杂的情况下,也可以长期稳定运行。 Swoole在Reactor线程中提供了Buffer的功能,可以应对大量慢速连接和逐字节的恶意客户端。另外也提供了CPU亲和设置选项,使程序运行的效率更好。 |  Swoole流程 | |-----| ![](https://box.kancloud.cn/2015-07-20_55aca2b577c95.)