PHP 界的扛把子 Swoole 异步通信利器

大家好,我是码农先森。

引言

我今天主要介绍的内容是包括但不仅限于 Swoole ,也有一部分 Go 语言的内容。

为什么要介绍 Swoole ?

先说一说背景吧,我们项目组之前要为《香港 01》开发一个积分系统的项目,这个系统的主要功能包括:会员积分的存储、积分的交易、积分的发放、积分的核销。当时我们项目组的架构师,首先考虑的技术选项是 Go 语言。但是,由于公司的技术栈主要是为 PHP,所以 CTO 在技术选项的审核时,就限定为 PHP 了。之后我们项目组的架构师,就不得已而为之,开始在 PHP 的领域考虑选择 Swoole 异步通信框架。刚开始时还调研了 Laravel-Swoole,因为它需要加载的依赖太多了,会影响程序的运行性能,所以放弃了。最后,还是敲定使用 Swoole 的原生框架。

届于我之前使用 Swoole 进行过一定的开发,所以把我对 Swoole 的了解及开发经验分享给大家,如果有那个地方讲的不好或者有什么问题,你们可以随时打断补充说明。

进程、线程、协程

在介绍 Swoole 之前,还是有必要先介绍一下进程、线程、协程的概念。因为在我们平常的 PHP 编程中,接触这几个概念会比较的少。当然如果对 PHP-FPM 比较熟悉的同学,对进程的概念也会比较的清楚。话不多说,我还是先介绍一下概念吧。

  • 进程是什么?

进程就是应用程序的启动实例。例如:打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源,数据资源,独立的内存空间。

  • 线程是什么?

线程属于进程,是程序的执行者。一个进程至少包含一个主线程,也可以有更多的子线程。线程有两种调度策略,一是:分时调度,二是:抢占式调度。

  • 协程是什么?

协程是轻量级线程,协程的创建、切换、挂起、销毁全部为内存操作,消耗是非常低的。协程是属于线程,协程是在线程里执行的。协程的调度是用户手动切换的,所以又叫用户空间线程。协程的调度策略是:协作式调度。

PHP-FPM 与 Swoole 的运行流程

  • PHP-FPM 运行流程图

  • Swoole 运行流程图

  • php-fpm 优缺点

优点:
部署起来简单快捷、调试代码方便、支持平滑重启服务。

缺点:
一次 Http 请求需要加载所有的依赖文件、并发性能不佳。

  • swoole 优缺点

优点:
支持毫秒级的定时器、高性能异步网络通信、常用进程模式。

缺点:
默认不支持平滑重启服务、不支持手动 dump 调试。

Swoole 介绍

  • 这里引用一下官方的定义

Swoole 是一个 PHP 的协程高性能网络通信引擎,使用 C/C++ 语言编写,提供了多种通信协议的网络服务器和客户端模块。可以方便快速的实现 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域。

  • Swoole 类图

Swoole 协程使用示例及详解

实战问题案例分析

在我们的积分发放系统中,使用到了 mongodb 存储,但是 swoole 没有提供 mongodb 协程客户端。 那么这种场景下,在连接及操作 Mongodb 时会发生同步阻塞,无法发生协程切换,导致整个进程都会阻塞。在这段时间内,进程将无法再处理新的请求,这使得系统的并发性大大降低。

使用同步的 mongodb 客户端

通过使用 Server->taskCo 来异步化对 mongodb 的操作

总结

今天我主要是介绍了 PHP-FPM 和 Swoole 的内部运行流程及 Swoole 协程的使用方法,Swoole 的应用场景还非常广泛。我经常听到网上有人说,PHP 快凉凉了。其实 Swoole 的出现又让 PHP 出现了新的生机。


欢迎关注、分享、点赞、收藏、在看,我是微信公众号「码农先森」作者。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LINUX centos 安装jenkins超超超超超超级详细步骤

Jenkins安装 配置jdkmavengit jenkins 拉取 配置 jdk 1.安装jdk8 yum install java-1.8.0-openjdk-devel2.检查版本 java -version出现如下图查看版本信息 3. 设置JAVA_HOME环境变量 vim /etc/profile最下方输入 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk expor…

鸿蒙开发HarmonyOS NEXT(一)

最近总听见大家讨论鸿蒙,前端转型的好方向?先入门学习下 目前官方版本和文档持续更新中 一、开发环境 提示:要占用的空间比较多,建议安装在剩余空间多的盘 1、下载:官网最新工具 - 下载中心 - 华为开发者联盟 (huaw…

记一次 APK 逆向动静调试 + so 动态链接库分析

0x00 前言: 好久没有做过安卓逆向了,最近重新系统地学习了安卓逆向技术。找到了一道较为典型的逆向分析题来练手,以锻炼动静态分析和动态链接库分析的基本能力。在这里记录基本的分析流程手法。 0x01 逆向分析: 一、使用 Genym…

视频汇聚平台LntonCVS视频集中存储平台技术解决方案

安防视频监控技术是一种利用各种监控设备捕捉实时画面,并将其传输至监控中心或数据存储设备的技术。随着科技的不断进步,监控视频技术也在不断改进,应用领域也在不断扩展。 然而,尽管技术进步,当前视频监控技术仍然面临…

线性代数基础概念:向量空间

目录 线性代数基础概念:向量空间 1. 向量空间的定义 2. 向量空间的性质 3. 基底和维数 4. 子空间 5. 向量空间的例子 总结 线性代数基础概念:向量空间 向量空间是线性代数中最基本的概念之一,它为我们提供了一个抽象的框架&#xff0c…

WIN版-苹果和平精英画质帧率优化教程

一、视频教程: 想要视频的联系博主 二、图文教程: 前置说明:不按教程,会导致修改不成功,或者设备里面内容丢失。请务必按教程操作!! 准备工作(这部分是在要改的设备上操作&#x…

JAVA每日作业day6.26

ok了家人们,今天我们学习了面向对象-多态,话不多说我们一起来看看吧 一.多态概述 面向对象的第三大特性:封装、继承、多态 我们拿一个生活中的例子来看 生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一…

如何轻松获取 GitLab 指定分支特定路径下的文件夹内容

第一步: 获取 accessToken 及你的 项目 id : 获取 accessToken ,点击用户头像进入setting 按图示操作,第 3 步 填写你发起请求的域名。 获取项目 id , 简单粗暴方案 进入 你项目仓库页面后 直接 源码搜索 project_id, value 就…

基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)

一、效果图 二、方法 改变elementUI 的主要色 --el-color-primary 为自己选择的颜色,核心代码如下: // 处理主题样式 export function handleThemeStyle(theme) {document.documentElement.style.setProperty(--el-color-primary, theme) } 三、全部代…

Fragment与ViewModel(MVVM架构)

简介 在Android应用开发中,Fragment和ViewModel是两个非常重要的概念,它们分别属于架构组件库的一部分,旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件,它能够作为…

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息,k8s: 1.27.x,nacos: 2.0.3。运行环境为 centos 7.x。 实…

centos 使用证书验证拉取gitee代码 配置

简单记录下过程 按官方网站提示即可 cd ~/.ssh/ #如果没有证书 生成一个 ssh-keygen -t rsa[root萨法是的 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):▽ Enter passphrase (empty for …

logstash配置文件中明文密码加密

1 案例背景 应用配置文件中禁止使用明文密码,需要加密处理 上图中,红框打码位置为es的明文密码,需要对其进行处理 2 创健keystore文件 /rpa/logstash/bin/logstash-keystore --path.settings /rpa/isa/conf/logstash/ create 注&#xff1…

2024全网最全面及最新且最为详细的网络安全技巧四 之 sql注入以及mysql绕过技巧 (2)———— 作者:LJS

目录 4.5 DNS记录类型介绍(A记录、MX记录、NS记录等,TXT,CNAME,PTR) 4.5.1 DNS 4.5.2 A记录 4.5.3NS记录 4.5.4 MX记录 4.5.5 CNAME记录 4.5.6 TXT记录 4.5.7 泛域名与泛解析 4.5.8域名绑定 4.5.9 域名转向 4.6 Mysql报错注入之floor报错详解…

Okhttp响应Json数据

简介 OkHttp是一个高效、现代的HTTP客户端库,专为Android和Java应用程序设计,用于发送网络请求和处理响应。它支持HTTP/2和SPDY协议,允许连接复用,减少延迟,提高网络效率。OkHttp还处理了常见的网络问题,如…

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源:https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站:OPEN IMAGES 2、准备标签labels 网站:CVAT 有点是:支持直接导出yolo格式的标…

Flutter实现页面间传参

带参跳转 步骤 在router中配置这个路由需要携带的参数,这里的参数是 arguments,注意要用花括号包裹参数名称 在相应组件中实现带参构造函数 在state类中可以直接使用${widget.arguments}来访问到传递的参数 在其他页面中使用Navigator.pushNamed()带参跳转

ansible自动化运维,(2)ansible-playbook

三种常见的数据格式: XML:可扩展标记语言,用于数据交换和配置 JSON:对象标记法,主要用来数据交换或配置,不支持注释 YAML:不是一种标记语言,主要用来配置,大小写敏感&…

BUG cn.bing.com 重定向的次数过多,无法搜索内容

BUG cn.bing.com 重定向的次数过多,无法搜索内容 环境 windows 11 edge浏览器详情 使用Microsoft Edge 必应搜索显示"cn.bing.com"重定向次数过多,无法进行正常的检索功能 解决办法 检查是否开启某些科_学_上_网(翻_墙&#xf…

电脑高手推荐:三款超实用软件,让你的电脑如虎添翼!

7Zip 7-Zip是一款免费且开源的文件压缩工具,支持多种文件格式,包括其自带的7z格式、ZIP、GZIP、BZIP2和TAR等。该软件由Igor Pavlov于1999年开发,具有高压缩比的特点。7-Zip不仅可以在Windows操作系统上使用,还可以在Unix-like的操…