swoole学习笔记

2024-05-07 18:38
文章标签 swoole 笔记 学习

本文主要是介绍swoole学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

swoole是php的一个扩展,主打高性能的网络编程扩展,由于扩展使用c语言编写,性能上会比php实现的框架快很多。而且因为swoole的内部实现给php提供了比apache+php更多的灵活性。接触swoole也已经有1年有余,在公司项目也使用了swoole为app提供功能服务。

春节期间在家为了能更好的使用swoole,深入的了解内部实现,于是特别去阅读了swoole主要的核心源码。为了阅读c代码特别去折腾了emacs的插件。

一、模块

swoole源码都是模块实现的,这里主要记录主要的几个模块,其他的暂不分析(主要是懒,源码都没有接着看完)


swoole使用了reactor设计模式实现高并发:

概念:

一种基于事件驱动的设计模式,将一个或多个并发服务请求分离(demultiplex)和调度(dispatch)给应用程序。在事件驱动的应用中,同步地、有序地处理同时接收的多个服务请求。 在reactor层面来说依然是同步的,但是对于应用层面他是异步非阻塞的模式。

1、reactor

swoole使用epoll系列来处理socker网络套接字,他是多路复用IO接口(select/poll)的改进版,epoll有一个专门的消息队列,不需要遍历所有监听的套接字描述符,为高并发的网络链接提供了更好的性能。上图每一个reactor线程都维护了一个reactor模块实例,这个模块就是负责创建epoll实例,监听感兴趣的套接字事件,并设置对应事件处理函数。主线程master获取到一个已连接tcp,并创建一个连接socker套接字后,通过平衡算法将连接socker添加到其中一个reactor线程中监听读写等事件。

2、Factory(这并不是一个工厂模式)

消息的投递,将reactor线程接收到的数据投递到worker工作进程中处理。worker工作进程将发送给click的数据投递到reactor线程,由reactor线程负责发送给click

3、Manager

这是一个进程管理模块,worker、task进程异常关闭manger会重新fork一个新的进程。在process模式下负责创建woker进程。

4、ReactorThread、ReactorProcess

swoole有三种运行模式:

  1、base:主进程就是管理进程 ,reactor在worker进程中创建,减少了两次进程间通信。次模式下会使用ReactorProcess

2、process:这个模式就是上图所描述的结构,这个模式运行会调用ReactorThread模块,因为这个模式下reactor是由线程维护的

3、线程模式:

用于创建reactor线程,拼接click发送的tcp/dup数据



swoole已process模式运行,由主master线程负责accpet从队列中获取已经通过三次握手建立连接的套接字,创建新的连接,将新的链接添加到reactor线程中通过epoll_ctl设置监听事件,当收到客户端信息的时候reactor线程负责接受数据,并在reactor线程中将拼接好的数据通过进程间通信IPC投递到worker进程中,worker负责处理业务逻辑,在woker中可将耗时并且不影响业务逻辑处理的任务放入task进程池中进行处理(这便是swoole提供给php更多灵活性的一点),这样即使是在并发较大的情况下,服务器依然能够接受来自客户端的业务请求。

公司业务中我便是将一些耗时的例如图片处理、日志等任务放入异步队列中。框架是自己实现的,非常简陋,用swoole实现了日志队列。

由于swoole是常驻内存的,这也给php提供了更高的性能,因为不需要每次请求都去加载文件初始化创建资源等,毕竟资源的创建是比较耗时的,例如链接mysql资源,在swoole中mysql链接可以提前创建好,需要用的时候直接从链接池中获取提前创建好的连接对象,而使用apache的方式则是将php作为一个apache的一个模块被加载,每次请求都需要重新加载文件,创建mysql连接。



这篇关于swoole学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968071

相关文章

threejs坑记录-笔记

雪花 注意depthTest: false 否则会出现有transparent无效 const createSnow = () => {let map = new THREE.TextureLoader().load(snow);let material = new THREE.SpriteMaterial({map: map,transparent: true,side: THREE.Dou

tabhost学习精要

今天学习了 tabhost类   1.系统自动添加了 相对布局的代码  我们在视图布局中 在composite中直接拖动tabhost到界面上 2.把相对布局的命名空间复制粘贴到tabhost,把tabhost中的关于相对布局的代码删掉,再删除顶部的相对布局的代码和底部的标签,让tabhost直接做布局,(也可以在空布局中添加tabhost 但是会自动添加的代码很少)。此时会报告

2、swift学习-创建基本的控件

与OC想比较而已,其实用swift创建一些基本控件的方法都是一样的,一些基本的属性都是大同小异,只是语法稍稍不同而已,对于刚刚由OC开始学习swift的可能有点不太习惯,但是没关系,多写多练自然而然就会顺手的。 一、用swift创建一个UILabel func createLabel() {         let label = UILabel (frame: CGRect

1、swift学习-字典的基本使用

1、创建一个字典          var dic:Dictionary<String,String> = ["三国演艺":"罗贯中","水浒传":"施耐庵","红楼梦":"曹雪芹","西游记":"吴承恩"]; 2、打印字典的值     println(dic);     结果如下图:      3、访问字典中某一个键值     var

Swift学习 字符串的操作 2022年11月更新

Swift 字符串的使用 Swift 字符串是一系列字符的集合。例如 “Hello, World!” 这样的有序的字符类型的值的集合,它的数据类型为 String 一、基本使用 1.1字符串的拼接 let str1 = "Hello"let str2 = "World"let str3 = str1 + str2print(str3); 1.2 字符串的插入 for index

iOS 学习资源

一、个人博客 1、刚刚在线 2、浅谈iOS开发中方法延迟执行的几种方式 3、MBProgressHUD 4、MJRefresh 5、AFNetworking 6、iOS数据持久化 7、iOS微信支付 二、常用的开发平台地址 1、银联支付开发平台

SpringBoot 学习六:数据库的增删改查

1、新建一个Girl类,添加如下代码: package controlle;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entitypublic class Girl {@Id@GeneratedValueprivate Integer

SpringBoot 学习五:连接数据库

1、在pom.xml需要添加与数据库相关的两个依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>my

SpringBoot 学习四:macOS安装MySQL 以及报错解决

从MySQL官网下载Mysql,在本地安装好之后,用数据库连接工具Sequl Pro去连接数据库,发现报错了,报错信息有两种: Error1:Unable to connect to host 127.0.0.1 because access was denied.Double-check your username and password and ensure that access fro

SpringBoot 学习三:Controller的使用

1、给同一个类添加两个访问地址 在浏览器里输入: localhost:8081/hello 或者 localhost:8081/hi都能访问到。 2、给整个类指定一个URL  通过设置@RequestMapping("/hello"),给整个类指定一个URL  这个时候就需要通过http://localhost:8081/hello/hi去访问这个类了。 3、如何处理url中的参