Swoole项目思维转换

简介:

PHP是最好的语言,Swoole重新定义了最好的语言,这当然是个梗了,不过php做为一个入门低、开发快、执行效率高的一门语言,而在以快速著称的pc互联网时代,无可争议的成为首选,这是php的优势,然后优势慢慢转化为思维定势,在很多工程师看来php开发就等同于web开发,然而如今已经是移动互联的时代,物联网,智能硬件也如火如涂,好像PHP不是那么受待见了(ps:一直如此),而swoole的出现,成功突破了这一思维定势,使phper可以从web开发跳出,进入了更大的服务器网络编程领域,但web开发和服务器网络编程在开发思维上还是有很大的不同,本系列文章将通过swoole的介绍,帮助大家做思维转换,从而进入一个新天地。

PHP与SWOOLE的关系
swoole是php的一个扩展,纯c开发,主要是为了补充php在网络编程方面的不足

PHP与SWOOLE的运行模式
php做为swoole的宿主,所以了解php本身的运行模式是必不可少的,下图是以cli下执行一个php文件时的完整流程

 

这上层有个SAPI的概念,SAPI是php给外部环境能够执行php内核提供的一个统一接口,我们常见的三种SAPI有cli, php-fpm, mod_php。

在这里,以fpm为例,把运行周期的关键5步拿出来:
1MINIT
在这步(包括之前)php引擎会初始化一些公用配置,读取ini文件,加载zend引擎,执行所以模块的MINIT模块,然后就长驻在fpm进程中,然后就等待处理请求
2RINIT
在每个请求过来之后,会调用所有模块的RINIT进行一些请求内数据的初始化,比如一些超全局变量,一些模块数据初始化等
3执行php
然后在这加载php文件,进行词法,语法分析,生成opcode代码,交由zend vm执行, 暂存执行结果
4RSHUTDOWN
在把结果返回给fpm之前,会调用所有模块的RSHUTDOWN模块进行一些数据的回收,zend vm也会关闭打开的数据流,进行内存释放等操作,然后把暂存的执行结果flush输出
5MSHUTDOWN
这一阶段在重启fpm时发生,会调用所有模块的MSHUTDOWN,关闭zend引擎等操作
到这,可以得到一些结论:
fpm每个请求都是在执行2~4步
opcode cache是把第3步的词法分析、语法分析、生成opcode代码这几个操作给缓存起来了,从而达到加速的作用

几个误区:
1请求都是独立的,不能进行数据共享? 其实还是有办法进行在数据共享的,那就是在MINIT这步,因为这一步的数据是长驻在fpm进程中,比较典型的是ini配置文件,我没看过鸟哥新出的yaconf, 不过我猜测yaconf的配置读取也应该是放在这一步进行

2每个请求都能独立释放内存, 所以总体是安全的。(这也是大多数phper没有关闭资源的习惯,如MySQL close等),那这也是有问题的,很有可能在扩展层有内存泄漏的存在,所以fpm提供max_reuqest来重启fpm,达到完全释放内存的目的,当然总体而言,php在内存控制方面还是相当不错的。
OK, 我们分析出了php的基本流程,那swoole是在哪一步执行的呢?首先,swoole运行有个前提条件:必需在cli模式下执行. 然后在第3步,swoole就接管了php,进入了swoole的生命周期了。swooele的生命周期以多进程模式为例,如下:
1onStart
在回调此函数之前Swoole Server已进行了如下操作
已创建了manager进程,已创建了worker子进程,已监听所有TCP/UDP端口,已监听了定时器
此函数是在主进程回调的,和worker进程的onWorkStart是并行的没有先后之分,在此回调里强烈要求只做log记录,设置进程名操作,不做业务逻辑,否则业务逻辑代码的错误导致master进程crash,让整个swoole server不对对外提供服务了。

2onWorkStart
每个worker或task进程在启动之后,会回调此函数,由于此回调类似于fpm里的MINIT,所以可以在这里做一个全局的资源加载,框架初始化之类的操作,这样可以对每个请求做全局共享,而达到提升性能的目的

3onReceive
每个请求(也称数据到达),会回调此函数,然后进行业务逻辑处理,输出结果

4onWorkerStop
worker退出时,会回调此函数。

5onShutDown
swoole服务停止回调此函数,然后继续fpm的第4、5步,进而退出PHP生命周期。   

相关文章
|
10月前
|
存储 NoSQL 测试技术
Python 架构模式:第十章到结语
Python 架构模式:第十章到结语
184 0
|
Python
【python基础知识】8.编程思维:如何解决问题-思维篇
【python基础知识】8.编程思维:如何解决问题-思维篇
182 0
【python基础知识】8.编程思维:如何解决问题-思维篇
|
安全 Go
Go语言封装艺术:代码安全与结构清晰
Go语言封装艺术:代码安全与结构清晰
97 0
|
8月前
|
监控 测试技术 Python
颠覆传统!Python闭包与装饰器的高级实战技巧,让你的项目效率翻倍
【7月更文挑战第7天】Python的闭包与装饰器是强大的工具。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建和工厂模式。例如,`make_power`返回含外部变量`n`的`power`闭包。装饰器则允许在不修改函数代码的情况下添加新功能,如日志或性能监控。`my_decorator`函数接收一个函数并返回包装后的函数,添加了前后处理逻辑。掌握这两者,可提升编程效率和灵活性。
57 3
|
6月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
7月前
|
安全 搜索推荐 开发者
"揭秘Python编写的艺术境界:不规范代码的悲剧,规范之美让你事半功倍!"
【8月更文挑战第21天】编写高质量Python代码需遵循规范以提升可读性和可维护性。例如,变量命名应采用小写字母加下划线(如`user_name`而非`uName`),函数命名清晰并避免硬编码(如使用`calculate_circle_area`替代`area_of_circle`并定义精确π值)。此外,添加有意义的注释(如解释冒泡排序逻辑),合理排版(如明确函数参数与返回值),以及适当异常处理(确保文件操作安全),都是良好实践。遵循这些规范能显著提高代码质量和团队协作效率。
55 0
|
7月前
|
测试技术 程序员 开发者
探索代码整洁之道:编写可维护和可扩展的Python程序
【8月更文挑战第3天】在编程的海洋中,我们经常追求的是那些能够高效运行、易于理解和维护的代码。本文将深入探讨如何通过遵循一系列的最佳实践来提升Python代码的整洁度,从而增强其可维护性和可扩展性。我们将通过具体示例,展示如何应用这些原则来编写更优雅、更健壮的Python程序。
53 0
|
9月前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
8月前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
48 0
|
10月前
|
存储 JavaScript 前端开发
深度剖析JavaScript中的变量世界:概念、用例与避坑指南
【4月更文挑战第3天】探索JavaScript变量:了解var、let、const的差异,掌握数据类型、用例及避免错误的策略。声明变量时注意作用域和可变性,如var的函数作用域,let和const的块级作用域。理解基本数据类型(Number、String等)和对象类型。示例包括用户输入、计算、控制流程和函数参数。警惕未声明、作用域混淆、类型不匹配和未初始化的错误,遵循最佳实践,如明确命名、避免冗余和适时复用,利用类型检查工具提升代码质量。
236 1