一起从根上学习Swoole

news2024/11/25 17:21:50

在这里插入图片描述

一起从根上学习Swoole

Swoole,这个名字已经不再是一个简单的扩展库,而是一种让PHP开发者们心驰神往的技术。它是一个基于事件驱动的异步网络通信框架,能够让PHP应用程序在高并发环境下实现卓越的性能表现。现在,你也可以像一名高超的工程师一样,彻底掌握Swoole的精髓,让你的PHP应用程序达到前所未有的速度和可靠性。

如果你是一名PHP开发者,你一定知道PHP的瓶颈之一是它的同步阻塞式I/O模式。这意味着当一个PHP应用程序需要等待某个I/O操作完成之后才能继续执行下一条语句时,整个进程就会被阻塞。这种模式在高并发环境下很容易导致进程崩溃,造成用户体验的恶化。但是,现在,有了Swoole,你可以轻松地实现异步非阻塞I/O模式,让你的应用程序在高并发环境下保持稳定和高效。

Swoole的强大之处不仅仅在于它的异步非阻塞I/O模式,它还能够实现协程、定时器、进程管理和内存共享等功能。这些功能使得Swoole成为PHP开发者进行高并发、大流量应用程序开发的不二之选。

不要再让你的应用程序被同步阻塞式I/O模式拖累,不要再让用户体验受到影响。学习Swoole,你将拥有一个强大的工具,让你的应用程序在高并发环境下实现更快的响应速度、更高的并发处理能力、更稳定的性能表现。Swoole已经成为PHP开发者们的必备技能之一,现在就加入这个行列吧!

PHP运行模式

cgi协议模式

通用网关接口,允许web服务器通过特定的协议与应用程序通信:
用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户
由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低

fast-cgi模式

cgi模式的升级版,它是一个常驻性的cgi,只要开启后,可一直处理请求,不再需要结束进程。
web服务器fast-cgi进程管理器初始化->预先fork n个进程
用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理
->处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户

模块模式

把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理。

php-cli模式

命令行模式,与常规web模式不同:没有超时时间,默认关闭buffer缓冲,标准输入输出错误的使用,可使用swoole扩展。

php进程模型

php-fpm是什么?

fastcgi进程管理器,用于替换PHP fastcgi的大部分功能,功能包含有:
平滑停止/启动的高级进程管理功能,标准输入输出错误日志记录,文件上传优化支持,
在发生意外情况的时候能够重新启动并缓存被破坏的opcode,慢日志记录脚本

php-fpm工作机制

php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务
用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理
->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户

php-fpm问题

  • 并发性能

在一个进程内,同时只会处理一个请求,也就是说,一个worker进程,这个进程内,同一时刻,只会处理一个请求,并发性能就是你worker能开多少的问题,你有100个进程,同时只能处理100个请求,剩下的只能等着排着队,这个是php-fpm并发性能不好的根本原因,无限制开启这个进程,会导致cpu把大量的开销浪费在进程的上下文切换上,带来更大的开销

一个worker就是一个进程,进程是隔离的,一个进程同一时间内只会处理一个请求,这个进程内所有变量资源都是独立的,请求结束,会将这些资源清理,保证不会被污染,优点是简单上手。

swoole进程模型

介绍swoole

swoole虽然是标准的php扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数,而swoole扩展在运行后会接管php的控制权,进入事件循环。当IO事件发生后,swoole会自动回调指定的PHP函数。
swoole和php-fpm的区别是swoole不依赖于php-fpm。

swoole工作机制

使用swoole的时候,先注册了一些回调函数,使用server start,也会创建一个master进程,然后会预创建n个worker进程,每个worker进程都会独立处理请求,和php-fpm没什么区别。
区别是在于,swoole的worker进程执行完之后,不会退出,也不会做任何清理,它只会继续的执行下一个请求,
php-fpm每一次请求过来的时候,它都会重新从index.php读取和加载,是因为它整个的php执行信息清理掉了。
而swoole这种常驻进程,是把所有代码预先注册到回调函数里面去,它什么都没有处理,它一直再等待你的事件,发生事件进行回调。
都是多进程模型。

swoole的进程模型

swoole会创建一个manager进程专门管理work和task进程。而work进程是直接通过unix socket和master进程通讯。

swoole生命周期

变量、对象、资源、require/include的文件等有四种生命周期

  • 程序全局期

在Server->start之前就创建好的对象,称之为程序全局生命周期,这些变量再程序启动后就会一直存在,直到整个程序结束运行才会销毁。
程序全局对象所占用的内存是worke进程间共享的,不会额外占用内存。这部分内存会在写时分离,在worker进程内对这些对象进行写操作时,会自动从共享内存中分离,变为进程全局对象。
include/require的代码,必须在整个程序shutdown时才会释放,reload无效。

  • 进程全局期

Server启动后会创建多个进程,每个worker子进程处理的请求数超过max_request配置后,就会自动销毁。
Worker进程启动后创建的对象(onWorkerStart),在这个子进程存活周期之内,是常驻内存的,onConnect/onReceive/onClose中都可以访问它。
include/require的文件,在reload后就会重新加载。

  • 会话期

会话期是在onConnect后创建,或者在第一次onReceive时创建,onClose时销毁。一个客户端连接进入后,创建的对象会常驻内存,直到此客户端离开才会销毁。
php-fpm的会话期,并不能感知,只有单次访问时使用session_start,访问$_SESSION全局变量才能得到会话期。
swoole的会话期的对象直接常驻内存,不需要session_start,可以直接访问对象,执行对象方法。

  • 请求期

请求期是指一个完整的请求发来,也就是onReceive收到请求开始处理,直到返回结果发生response。这个周期所创建的对象,会在请求完成后销毁。
php-fpm请求期和swoole是一样的,请求到来时创建,请求结束后销毁。

协程简介

  1. 同步阻塞的问题

php下每一个进程都是同步阻塞的模型,比如1号请求是查库,2号请求是http请求,两个请求都是耗时1s。
php是一个单线程模型,每一个进程只有一个线程,那么就是说这个请求一旦遇到阻塞,它就会挂起,一直等到有io返回,才会继续往下执行。
io在阻塞的时候,什么都不能干,只能等。
swoole的worker进程是有限的,php解决并发性能不好本质是提高worker处理能理(本质上是提高cpu的利用率),不要以进程为粒度,用协程。

  1. 协程原理

当worker处理一个请求,可能有很多请求,当它遇到一个io操作需要1秒钟,把这部分上下文保存起来,然后处理其他操作。
就是一个请求,一旦遇到了IO操作,立刻就把这份状态保存起来,转去处理第二个请求,第二个遇到IO操作保存,转去第三个请求,依次类推。

  1. swoole协程工作机制

swoole的协程是自动的,当协程内遇上I/O操作(mysql,redis)等时,swoole的协程会自动切换,运行到下一个协程任务中(切换后,I/O继续执行),
直到下一个协程任务完成或者被切换(遇上I/O),如此反复,直到所有协程任务完成,则任务完成。

  1. 协程解决了什么

协程解决了 将一个线程,原来阻塞的时间重新整理,充分利用每一个阻塞的时间,让你每一个请求在同一个线程上交替执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS:DWA算法解析、move_base导航包DWA源码解析

一.整体思路 1.基于速度控制运动模型 假设没有噪声,控制时间间隔为内机器人速度v和角速度w保持不变,则机器人围绕半径为r的圆周运动。 其中,。 根据v 和w即可预测出下一次机器人位姿(x、y、),根据此也可以…

毕业4年,克服三次瓶颈,最终成功从字节跳动成功跳到阿里!经验分享

介绍下自己的测试历程吧,普通本科,毕业4年, 去年成功转型测试开发,总结一下测试心得。 平凡的大学生活 我大学期间属于并没有什么出众的,按部就班,老实办事的那种学生,我导师对我们那届的学生…

iOS 17(SwiftUI 5.0)带来的图表(Charts)新类型:“大饼”与“甜甜圈”

概览 WWDC 2023 为我们带来了 iOS 17,也为我们带来了 SwiftUI 5.0。 在 SwiftUI 新版中,Apple 增加了很多重磅功能,也对原有功能做了大幅度升级。 对于 Charts 框架, 新增了饼图(Pie)类型并且加入了图…

容器镜像差异分析工具 container-diff

概述 container-diff 是google出的一个容器差异比较工具,通过这个工具可以比较两个镜像之间存在的文件差异、RPM包差异、apt包差异、pip包差异和node包差异。 container-diff 也包括了对单个镜像分析能力,像文件分析啊、apt包、rpm包分析等功能。 在日常…

Python爬虫——怎么搭建和维护一个本地IP池

目录 背景 一、什么是本地代理IP池 二、代理IP池功能架构图 三、各个组件功能说明及示例代码 1. IP池管理器 2. 代理IP获取器 3. IP质量检测器 4、数据存储器 5、API接口层 6、应用程序 总结 背景 在我们进行爬虫工作时,经常需要使用代理IP。大多数代理…

unity2d粒子特效

文章目录 前言先看效果一、2d平台雨1. 配置2. 图片素材3. 最终效果 二、脚步灰尘效果1. 配置2. 代码调用3. 效果 三、受伤血液四溅效果1. 配置2. 效果 待续四、工程源码五、参考六、完毕 前言 我只是我抽空写了一些简单的2d粒子特效,后面如果接触新的不错的2d特效&a…

Maven 安装

一. 下载 apache官网下载 Maven:Maven – Download Apache Maven ,根据需要下载不同压缩包。 将压缩包进行解压,最好放在无中文目录下解压。 二. 安装 三. 配置 1. 配置maven本地仓库 打开解压后的文件夹,找到conf文件夹&#…

银行vr元宇宙全景虚拟展馆提供更加真实、立体、高效的数字资产交易场景

为了贯彻国家普惠金融政策,使金融如无惠及广大群体,宇宙技术在金融行业中的应用将进一步提升金融消费体验感觉和金融管理水平。打造元宇宙金融服务平台,构建虚实结构的金融服务世界,培育和管理好数字机器人员工队伍,提升金融业务各…

postman登录鉴权之接口测试

一.背景 在做接口测试的时候,有些接口向后台请求数据的时候,是需要用户在登录情况下才有数据返回。 以电商平台为例,用户的个人中心,用户的订单列表,用户的支付信息等等,所有用户维度的数据都是需要登录态…

Django - 页面静态化和crontab定时任务(二)

一. 前言 一个网页会有很多数据是不需要经常变动的,比如说首页,变动频率低而访问量大,我们可以把它静态化,这样就不需要每次有请求都要查询数据库再返回,可以减少服务器压力 我们可以使用Django的模板渲染功能完成页面…

app反编译查看是否被混淆或者混淆是否成功

同时打 debug包和release包,生成的目录在build->output文件夹下面 一般直接运行的apk 包是在build/intermediates/apk/debug 目录下 方法1:Android studio 安装插件jadx build成apk 后 直接选中 右键 在Jadx GUI中反编译 就可以查看代码 方法2&…

距离保护的影响因素

1、汲出电流和助增电流的影响 当保护安装处与故障点之间有分支电源时,如图所示,分支电源将向故障点K送短路电流ICB,使流过故障线路的电流IBKIAB ICB,大于实际流过保护1的电流IAB,所以ICB称作助增电流。 由于助增电流的…

第一章操作系统引论

目录 一、熟悉的操作系统 二、计算机系统的层次结构 三、操作系统的概念 四、操作系统的功能 4.1 系统资源的管理者 4.2 向上层提供方便易用的服务 4.2.1 GUI:图形化用户接口(Graphical UserInterface) 4.2.2 命令接口 4.2.3 程序接…

当杠精型AI丈夫遇上阴阳怪气AI老婆,你的代码玩得转吗?

玩趣味活动 赢千元奖金 DataFountain社区首个趣味活动来啦!!! 活动已发车,来不及解释了,先上车:https://www.datafountain.cn/information/activity/3 人工智能问答爆火,你的算法技能储备跟上…

达梦数据库ODBC配置及达梦与mysql创建DBLINK测试

目录 官网ODBC配置... 3 1、ODBC下载官网... 3 2、上传安装包并解压... 3 3、安装odbc. 3 4、安装依赖... 4 5、再次执行安装即可... 4 6、查看版本及配置文件... 4 Mysql-ODBC配置... 5 一、达梦服务器... 5 1、下载odbc包... 5 2、安装... 6 3、报错... 6 4、先…

STM32——01-开发软件Keil5及STM32CubeMX的安装

1.1开发环境的安装 编程语言:C语言 需要安装的软件有两个:Keil5和STM32CubeMX 安装 安装包(不需要太新,以 MDK324 为例,最新的 MDK327 有问题) 安装过程一路下一步即可(建议不要安装在 C …

Gitlab集成jira

实现功能 gitlab提交和合并分支,会自动将comment信息提交到JIRA上的相关问题的页面gitlab可以修改jira上问题的状态 集成说明 gitlab集成Jira 按项目集成,因此gitlab上的每个项目对应jira上的对应项目由项目管理员(一般为接口人&#xff…

如何用Python开发QQ机器人

前言 虽然该文最终是达到以python开发mirai机器人的目的,但起步教程,尤其是环境配置上仍然有大量的相同操作,对其他编程语言仍有借鉴之处 假设你已经安装好了 Java、Python等运行必须的环境 mirai生态 mirai官方生态文档 要使用mirai开发…

【tableau】基础图形绘制

4.5 文字云 第一步: 想要突出显示的字段拖入 “标签”,如 客户名称 第二步: 展示大小的字段拖入“大小”,默认黑色 第三步:展示大小的字段拖入“颜色”,颜色不是喜欢的,可以右侧编辑颜色 4.6…

Vue中如何进行地图展示与交互(如百度地图、高德地图)?

Vue中如何进行地图展示与交互 随着移动互联网的普及,地图应用已经成为人们生活中不可或缺的一部分。在Vue.js中,我们可以使用第三方地图库(如百度地图、高德地图)来实现地图的展示和交互。本文将介绍如何在Vue.js中使用百度地图和…