Rumah > rangka kerja php > Swoole > 分享Swoole引擎原理的快速入门干货

分享Swoole引擎原理的快速入门干货

coldplay.xixi
Lepaskan: 2021-03-12 11:01:38
ke hadapan
2115 orang telah melayarinya

分享Swoole引擎原理的快速入门干货

过去半年使用PHP和Java两种技术栈完成了一个游戏服务器项目。由于项目中有高频的网络请求,所以PHP技术栈尝试使用Swoole引擎(基于事件的高性能异步并行网络通信引擎)来完成部分游戏业务。

推荐(免费):swoole

Swoole的安装

安装swoole很简单,由于是国人做的项目,很多issue可以在官网文档找到答案。安装分两种:

  • 编译安装。直接去github或者gitee去下载官方的发行版,编译安装后,将so拓展写入php.ini文件。
  • 容器安装。swoole引擎应用广泛,所以hub上有很多可用的容器,选择需要的pull一下即可。

具体操作百度一下即可,网上相关内容很多。

Swoole引擎的优势

  1. 常驻内存。传统 PHP框架或者单文件,在处理每个请求之前,都要做一遍加载框架文件、配置的操作,请求完成之后会释放所有资源和内存,无须担心内存泄漏。但是如果请求数量上升,并发很高的时候,快速创建资源,又马上释放,会导致 PHP 程序运行效率急剧下降。而使用 Swoole 则没有这个问题:PHP的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。以后都是直接载入 OPCODE ,让 Zend 引擎直接运行。另外,之前PHP不能实现的,如数据库连接池,缓存连接池都可以在Swoole引擎下实现。系统的运行效率会大大提高。
  2. 快速开发。Swoole引擎提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
  3. 协程编程模式。Swoole4可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步IO。

Swoole引擎的流程解析

Swoole运行的流程图如下:

Swoole的运行图

Swoole中的线程或进程

结构图如下:

Swoole的线程图

Swoole引擎分为两种模式:单线程模式和进程模式。本文只讨论进程模式。具体两者区别官方文档中有说明。

Master进程

用于处理swoole核心事件,比如来自客户端的连接,本地通讯的管道。master进程里有多个线程,每个线程运行了一个epol函数的实例。(由于Worker进程并不是由Master进程fork出来的,所以可能会出现强行kill Master进程后,Worker进程依旧存在)

Reactor线程

Swoole的主进程是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。
Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端

Manager进程

swoole中worker/task进程都是由Manager进程Fork并管理的。
子进程结束运行时,manager进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程
服务器关闭时,manager进程将发送信号给所有子进程,通知子进程关闭服务
服务器reload时,manager进程会逐个关闭/重启子进程

Worker进程

Swoole提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到max_request次数之后正常退出。主进程会重新拉起新的Worker进程。 Worker进程内可以像普通的apache+php或者php-fpm中写代码。不需要像Node.js那样写异步回调的代码。

各进程的回调函数

Master内的回调函数:

  • onStart
  • onShutdown

Worker进程内的回调函数

  • onWorkerStart
  • onWorkerStop
  • onConnect
  • onClose
  • onReceive
  • onFinish

TaskWorker进程内的回调函数

  • onTask
  • onWorkerStart

Manager进程内的回调函数

  • onManagerStart
  • onManagerStop

Reactor、Worker、TaskWorker的关系

可以理解为Reactor就是nginx,Worker就是php-fpm。Reactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理。Reactor和Worker间通过UnixSocket进行通信。
在php-fpm的应用中,经常会将一个任务异步投递到Redis等队列中,并在后台启动一些php进程异步地处理这些任务。Swoole提供的TaskWorker是一套更完整的方案,将任务的投递、队列、php任务处理进程管理合为一体。通过底层提供的API可以非常简单地实现异步任务的处理。另外TaskWorker还可以在任务执行完成后,再返回一个结果反馈到Worker。
Swoole的Reactor、Worker、TaskWorker之间可以紧密的结合起来,提供更高级的使用方式。一个更通俗的比喻:假设Swoole应用服务器是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干些杂事,让Worker专心工作。
底层会为Worker进程、TaskWorker进程分配一个唯一的ID。不同的Worker和TaskWorker进程之间可以通过sendMessage接口进行通信。

实际项目中的各进程线程的分工:

  • Manager进程:负责管理worker进程,创建或回收
  • Worker进程:游戏逻辑处理
  • taskWorker进程:向客户端发网络包、关闭长期不活跃的tcp连接

Swoole版本兼容性

该项目开发阶段使用的swoole引擎版本1.9.6,后来由于测试环境安装成了4.3.2版本,所以尝试业务代码作调整。不过swoole的向下兼容很值得佩服的是,这过程中竟然只发现了一处代码不兼容的问题:是有关swoole_server的一项配置参数,在原来版本采用了魔鬼数字进行配置的,但是到新版本,这个数字没有被宏定义,后来通过查看swoole源码找到了宏定义组,然后修改了这处配置。(不过版本升级顺利也是基于swoole的业务代码比较少,所以仅供参考

更多相关学习推荐:swoole教程

Atas ialah kandungan terperinci 分享Swoole引擎原理的快速入门干货. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan