Swoole v6 能否让 PHP 再次伟大?

大家好,我是码农先森。

现状

传统的 PHP-FPM 也是多进程模型的的运行方式,但每个进程只能处理完当前请求,才能接收下一个请求。而且对于 PHP 脚本来说,只是接收请求和响应请求,并不参与网络通信。对数据库资源的操作,也是一次请求一次有效,用完即销毁不能复用,在系统高负载的情况下对数据库等资源的消耗会很大,能承受的并发量有限。

Swoole 的出现给 PHP 带来了一种新的运行方式,完全接管了 PHP-FPM 的功能,并且弥补了 PHP 在异步网络通信领域的空白。Swoole 提供了 PHP 的全生命周期管理,此外 Swoole 的常驻进程模式,也能够高效的利用资源,比如可以建立数据库连接池、共享内存变量等。还有 Swoole 中能够支撑高并发的利器「协程」,更加使 PHP 的性能上了一个新的台阶,甚至在某些特定场景下都可以与 Go 语言的性能相媲美。

虽说 Swoole 给 PHP 带来了很大的性能提升,但也还是一个基于多进程模型的异步通信扩展,多进程的模式也存在着许多的问题,比如跨进程间的通信、进程间的资源共享等问题。简而言之,多进程会带来一定的系统资源消耗及产生新的问题。

因此 Swoole 官方为了解决多进程的问题,引进了多线程的支持,这意味着 v6 版本之后,Swoole 将会变成单进程多线程的运行模式。

v6 新特性

根据 Swoole 作者韩天峰发布的预告,在 v6 版本中增加多线程的支持。其中多线程的实现是基于 PHP 的 ZTS 机制和 TSRM API,在 PHP 层面隔离所有全局变量,实现线程安全。Swoole v6 的多线程将是真正的多线程实现,在单进程的模式下所有的 PHP 程序代码均是在多核并行执行,能够高效的利用好 CPU 资源。

v6 版本还提供了线程安全的 Map 和 ArrayList 数据结构,可以实现跨线程的数据共享读写。在 Server 端的 Event Worker、Task Worker、User Process 等将全部替换为 线程的运行方式,在同一个进程空间内执行,彻底摒弃了多进程的模式。

当然新的特性势必会带来新的开销,对于 Map 等共享的数据结构在多线程的模式下需要加锁,来避免数据竞争,可能会损耗一些性能。

以下是列举的一些线程相关的 API 方法:

  • use Swoole\Thread 线程对象。
  • use Swoole\Thread\Map 线程安全下的 Map 数据结构。
  • use Swoole\Thread\ArrayList 线程安全下的 ArrayList 数据结构。
  • Swoole\Thread::getId() 获取当前线程的 ID。
  • Swoole\Thread::getArguments() 获取父线程传递给子线程的参数列表。
  • Swoole\Thread::join() 等待子线程退出,请注意 $thread 对象销毁时会自动执行 join() ,这可能会导致进程阻塞。
  • Swoole\Thread::joinable() 检测子线程是否已退出。
  • Swoole\Thread::detach() 使子线程独立运行,不再需要 Thread::join()。
  • Swoole\Thread::HARDWARE_CONCURRENCY 硬件层支持的并行线程数量。
  • Swoole\Thread::$id 获取子线程的 ID。
  • Swoole\Thread::exec() 开启一个新的线程。

最后

自 Swoole 从 2012 年发布第一个版本开始,就扛起了 PHP 领域异步通信的大旗,但这多年以来 Swoole 的发展也是实属不易。还记得刚开始时的异步回调模式的套娃式编程方式,开发起来异常艰难,到后来的同步式编程,直接降低了PHP程序员的学习门槛,让 PHP 在实时通信、物联网通信、游戏开发等领域也能大展拳脚,同时在 PHP 的发展史上也产生了重大的影响。

随着 Go 语言在编程界的持续火热,Swoole 常常被 PHP 程序员拿来和 Go 语言一决高下,总是被诟病 Swoole 无法有效利用多核 CPU、进程间的通信困难等问题。话又说回来,Swoole 作为一个 PHP 的扩展程序和天生具有高性能的 Go 语言自然是不可比拟的,但 Swoole 也是在逐渐的向 Go 语言靠近,比如 Swoole 中也使用了「go、channel」关键词来实现协程及通信通道,虽说底层的实现机制还是大不相同的。

当然 Swoole 也在不断地努力持续优化,就像将要推出的 v6 版本增加多线程的支持,来改变目前多进程的局面。至于这个版本对 PHP 发展来说有没有很大的影响,我认为影响有限。但对 Swoole 的发展还是有很大的影响,毕竟以后再也不用受多进程的困扰了,这也是一大进步。

在 Web 领域作为世界上最好的语言,尽管 PHP 近年来的发展不尽如人意,但作为一名 PHPer 也有必要和有义务一起来维护和推动 PHP 生态的发展。


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

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

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

相关文章

Android (已解决)Execution failed for task ‘:app:lint‘

文章目录 一、错误原因二、解决方法 一、错误原因 这个错误信息表示在执行 Lint 检查时发现了错误,导致构建过程被中断。Lint 是一个用于检测 Android 项目中潜在问题的工具,比如性能、安全性、可用性等方面的问题。当Lint检查到严重错误时,…

“北京到底有谁在啊”影视APP开发,解锁最简单的快乐

随着电视剧《玫瑰的故事》在腾讯视频APP热播,APP也增加了很多热度,一款丰富的影视APP,无论是热门大片、经典影视剧、还是最新综艺节目,能畅享无限精彩的影视内容! 开发影视APP,需要专业的技术服务商来解决…

1500平方米气膜羽毛球馆的造价分析—轻空间

随着全民健身热潮的兴起,气膜羽毛球馆因其良好的空气质量、恒温恒湿的环境和快捷的建设速度,受到了越来越多人的欢迎。建造一个1500平方米的气膜羽毛球馆涉及多个方面的费用,包括场地准备、设备材料、安装施工、配套设施等。轻空间将详细分析…

AutoEncoder简介

1.介绍 作为一种无监督或者自监督算法,自编码器本质上是一种数据压缩算法。 编码器: 输入图像(在这个例子中是一个28x28像素的数字“9”)首先被输入到编码器中。编码器的任务是将这个输入压缩成一个更小的、密集的表示形式&…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

跌幅高达10.2分!32本Top,Elsevier旗下在检SSCI期刊(2024年6月影响因子更新版)

本周投稿推荐 SSCI • 1区,4.0-5.0(无需返修,提交可录) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.1-0.5&…

【单片机毕业设计选题24031】-基于STM32的智能手环设计

系统功能: 使用12864OLED液晶屏显示当前的步数,温度值,心率和报警值,单位是心率/分钟设置步长,测量里程;可以设置温度心率的上下限报警值,设置、加、减;用红外传感器XL01实现心率的测量&#x…

win10免安装配置MySQL8.4.0

注:此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接:MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download(当前时间2024-06-19最新版本是8.4.0) 2、解压并添加配置文件 下载完毕后,解压缩…

新能源汽车电机分类及工作原理

一、直流电机与交流电机 电机是一种将电能转换为机械能的设备,常见的有直流电机和交流电机两种类型。下面简要介绍它们的原理: 直流电机(DC Motor): 原理: 直流电机的工作原理基于洛伦兹力定律,即电流通过导线时&…

ABAP隐藏选择屏幕F8执行按钮的两种方式

在选择屏幕上画PUSHBUTTON的时候,通常不需要左上角的执行按钮,所以需要隐藏掉,两种方式可以实现,都需要在INITIALZATION或者AT SELECTION-SCREEN OUTPUT事件中完成。 方式1: at selection-screen output.perform ins…

解决 Pyecharts 在 jupyter Lab 上运行图片空白问题!

文章目录 🏳️‍🌈 1 提前声明 JUPYTER_LAB🏳️‍🌈 2 load_javascript()🏳️‍🌈 3 render_notebook()🏳️‍🌈 4 图示🏳️‍🌈 5 可视化项目源码…

C++学习/复习20--继承的权限/向上转换/重定义/默认成员函数/友元/静态成员/菱形虚拟继承/组合

一、继承的概念 二、继承的权限 三、向上转换 四、重定义(隐藏) 五、派生类的默认成员函数 六、继承与友元 七、继承与静态成员 八、菱形继承 数据冗余与二义性 虚拟继承(virtual) 九、继承组合

如何提取mac app中的应用程序图标 x.app图标位置

在macos系统中安装的应用程序 .app的图标都是 以 .icns结尾的,默认位于 .app应用程序包中的Contents/Resources/目录下,只要是在这个目录下的 .icns文件就是这个应用的图标,如:mac版微信的图标就是 /Applications/WeChat.app/Co…

Stirling-PDF 安装和使用教程

PDF (便携式文档格式) 目前已经成为了文档交换和存储的标准。然而,找到一个功能全面、安全可靠、且完全本地化的 PDF 处理工具并不容易。很多在线 PDF 工具存在隐私和安全风险,而桌面软件往往价格昂贵或功能有限。那么,有没有一种解决方案能够…

Appium+python自动化(二十七)-让你在手机找到溜冰一样的感觉666,溜得飞起来 - 低级滑动(超详解)

简介 随着现在智能手机的普及和应用,小到五六岁或者更小的娃娃,老至七八十岁老头老太太都是智能手机的用户,基本上达到每个人都在用,每次在地铁或者公交上,就看看到这样的场面,手指不停地在手机屏幕上来来回…

游戏服务器研究三:bigworld 的 load balance 算法

1. 前言 bigworld 的 load balance 算法的大致思路是知道的,即 动态区域分割 动态边界调整。但具体是怎么实现的,不清楚,网上也不找到相关的文章介绍,所以只能自己看代码进行分析。 本文大致记录我所分析到的算法实现&#xff…

Appium+python自动化(二十八)- 滑呀滑,滑到奈何桥喝碗孟婆汤 - 高级滑动(超详解)

简介   奈何桥上叹奈何,三生石前憾三生,彼岸花下非彼岸,奈何三生彼岸人。 相传过了鬼门关便上一条路叫黄泉路,路上盛开着只见花,不见叶的彼岸花。花叶生生两不见,相念相惜永相失,路尽头有一条…

【JavaScript】流程控制和函数

目录 一、分支语句 1、if语句: 2、switch语句: 二、循环语句 1、while循环语句 2、for循环语句 三、函数声明 1、function 函数名(形参列表){ 函数体 } 2、var 函数名function(形参列表){函数体} 一、分支语句 1、if语句: if(表达式){ }else …

Vue-cli搭建项目----基础版

什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、南…