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 生态的发展。


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

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 57
余胜军

自 Swoole 从 2012 年发布第一个版本开始,就扛起了 PHP 领域异步通信的大旗,但这多年以来 Swoole 的发展也是实属不易

话又说回来,Swoole 作为一个 PHP 的扩展程序和天生具有高性能的 Go 语言自然是不可比拟的,但 Swoole 也是在逐渐的向 Go 语言靠近,比如 Swoole 中也使用了「go、channel」关键词来实现协程及通信通道,虽说底层的实现机制还是大不相同的

所以明明可以穿一条崭新的裤子(GO). 为什么要穿一条靠到处打补丁(swoole)的裤子(PHP)?

4周前 评论
李铭昕 4周前
wangbin 3周前
changebeizhanyong 4周前
Imuyu 4周前
pigzzz 4周前
mrpzx001 4周前
qingyan233 3周前
doudoubeibei 3周前

fpm与swoole是2个东西,大部分phper是fpm出身,技术素质参差不齐,而市场上主流项目基本都是fpm,所以swoole v6跟php伟大很难有什么关联性,swoole应该算另一种东西,跟传统php无关,只是挂了php的名而已。

4周前 评论

1.其实swoole在我用来就是配合octane的,主要就是常驻内存。 2.我还没遇到需要协程的地方,要是有大流量早就财富自由了,后面的活儿雇人交给Go好了,这样的人一大把。 3.都多线程了,干嘛不直接转java呢?当年不就是因为多线程玩各种锁同步,才出现协程的嘛?这下倒好,又回去了。 4.swoole据说还能调python用,那干嘛不直接上python呢?PHP装swoole还要编译,python傻瓜化一键安装,何必呢? swoole这个东西呢,技术底子是有的,可是没有自己的思想,甚至没有目标群,看上去啥高大上功能都有,等于都没有。这里抛开技术谈一下市场视角,ruby社区有个痛点就是后台任务,老外搞出了一个sidekiq,就做一件事,让rails用户轻松使用后台任务,专注一件事,专注一个特定领域,反而比什么技术都上好,less is more~

4周前 评论
lovewei 4周前
真的是你呀 4周前
xiaobin_123 3周前

直接上golang了,不香嘛,谁还去研究swoole,手动狗头

3周前 评论
余胜军

自 Swoole 从 2012 年发布第一个版本开始,就扛起了 PHP 领域异步通信的大旗,但这多年以来 Swoole 的发展也是实属不易

话又说回来,Swoole 作为一个 PHP 的扩展程序和天生具有高性能的 Go 语言自然是不可比拟的,但 Swoole 也是在逐渐的向 Go 语言靠近,比如 Swoole 中也使用了「go、channel」关键词来实现协程及通信通道,虽说底层的实现机制还是大不相同的

所以明明可以穿一条崭新的裤子(GO). 为什么要穿一条靠到处打补丁(swoole)的裤子(PHP)?

4周前 评论
李铭昕 4周前
wangbin 3周前
changebeizhanyong 4周前
Imuyu 4周前
pigzzz 4周前
mrpzx001 4周前
qingyan233 3周前
doudoubeibei 3周前
fatrbaby

如果swoole像当年的fpm一样,合并进php主干,那么应该就是相互成就了。不过swoole现在商业化,韩天峰估计不会让合并。

4周前 评论
JaguarJack 4周前
Jyunwaa 4周前
lovewei 4周前

swoole 商业化比较重。
得看php自带的fiber

4周前 评论
fatrbaby 4周前
Jyunwaa 4周前
deatil (作者) 4周前
狒狒达人 4周前
加了sugar 3周前
Jyunwaa

Swoole 的这个多线程略微抽象,它跟 C# Java 之类的传统多线程差别很大,如图:

file

根据微信公众号的前瞻,v6 旨在解决多进程之进程通信复杂、Table 不能动态分配内存、多进程调试困难等痛点。

file

线程通信需要在创建时传参,常量、全局变量之类的统统失效,v6 提供了三种数据结构:

file

对象或数组将在写入时自动序列化,读取时反序列化。请注意若对象或数组中包含不可序列化类型,将会抛出异常。

这几种数据结构的在读写数组或对象时会序列化和反序列化,所以目测性能不如 Table。线程参数传递

感觉有一点隔靴搔痒,虽然一直都喜欢 Swoole 并且看好 Swoole,但是这一次还是很难评价的。

4周前 评论
JaguarJack 4周前
加了sugar 3周前
Jyunwaa (作者) 3周前
Euning 2周前

fpm与swoole是2个东西,大部分phper是fpm出身,技术素质参差不齐,而市场上主流项目基本都是fpm,所以swoole v6跟php伟大很难有什么关联性,swoole应该算另一种东西,跟传统php无关,只是挂了php的名而已。

4周前 评论
chowjiawei

有消息 php9自带多线程扩展了

4周前 评论
lovewei 4周前
91it 4周前
chowjiawei (作者) 3周前
sunny123456 2周前

1.其实swoole在我用来就是配合octane的,主要就是常驻内存。 2.我还没遇到需要协程的地方,要是有大流量早就财富自由了,后面的活儿雇人交给Go好了,这样的人一大把。 3.都多线程了,干嘛不直接转java呢?当年不就是因为多线程玩各种锁同步,才出现协程的嘛?这下倒好,又回去了。 4.swoole据说还能调python用,那干嘛不直接上python呢?PHP装swoole还要编译,python傻瓜化一键安装,何必呢? swoole这个东西呢,技术底子是有的,可是没有自己的思想,甚至没有目标群,看上去啥高大上功能都有,等于都没有。这里抛开技术谈一下市场视角,ruby社区有个痛点就是后台任务,老外搞出了一个sidekiq,就做一件事,让rails用户轻松使用后台任务,专注一件事,专注一个特定领域,反而比什么技术都上好,less is more~

4周前 评论
lovewei 4周前
真的是你呀 4周前
xiaobin_123 3周前

真的,用了静态语言,感觉动态语言真的不适合大项目,只能用来做网站

4周前 评论
yefy 3周前
勇敢的心 (作者) 3周前
yefy 3周前
梦想星辰大海 3周前
勇敢的心 (作者) 3周前
yyy123456 3周前
勇敢的心 (作者) 3周前
kinyou

我敢打赌过几天就有一个网名叫美国总统的网友来推B站某神的视频

4周前 评论

先兼容好window环境吧,现在很多公司还是不会配mac给员工的。哈哈哈

4周前 评论

直接上golang了,不香嘛,谁还去研究swoole,手动狗头

3周前 评论

php啥时候直接内置协程才是王道

3周前 评论

:joy: 果然会有人说什么动态语言静态语言的问题。。。 什么大项目小项目的问题。 如果我没记错,腾讯前一阵还把一个超大的 php 项目重构了。 如果你都没腾讯这个量,聊锤子的动态语言,静态语言。。。还是考虑考虑你的车贷房贷和育儿贷吧。

3周前 评论
芝麻开门 3周前
芝麻开门 3周前
ononl 3周前

webman就很快啊,但是并没有啥人用。

3周前 评论
小李世界 3周前
IT学徒 (作者) 3周前

workman 是window也可以,没那么复杂,或者直接go也比swoole友好

3周前 评论

小公司用workerman 大公司用go

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!