28
回答
【开源访谈】韩天峰:从 2.x 跃入 4.x ,Swoole 开发背后的故事
华为云4核8G,高性能云服务器,免费试用   

6月14日,流行 PHP 协程引擎 Swoole 正式发布 4.0 版本,支持在 PHP 代码中的任意位置使用协程,并带来了全局变量隔离、支持 MySQL 存储过程等新特性。

Swoole 的上一个版本系列是 5 月份发布的 2.2.0 ,为什么会跳过 3.0 直接跃入 4.0 开发?Swoole 3.0 原本计划具备哪些特性?Swoole 4.0 放弃基于 libco 做协程的原因又是什么?本期【开源访谈】邀请到了 Swoole 项目创始人韩天峰老师 @matyhtf ,为大家分享 Swoole 开发背后的一些故事。

—— 嘉宾简介 ——

韩天峰,Swoole 和 PHP-X 开源项目创始人,资深程序员,写了近 10 年 PHP 和 C 代码。前腾讯朋友网、淘宝搜索 PHP 系统工程师,虎牙直播移动端后台负责人,车轮互联架构师。7月份将成为一名全职的开源工作者,开始自己的创业之路。

—— 访谈正文 ——

Q:能和我们分享一下 Swoole 3.0 原本的一些计划吗?具体是因为什么原因导致跳过该版本直接进入 4.0 的开发呢?

使用过 Swoole 2.0 的 PHPer 都了解,Swoole 第一版的协程实际上是存在一些兼容性问题的,不是所有地方都可以使用协程,如 __call/__get/__set 等魔术方法、__destruct 析构函数、反射函数、call_user_func/array_map 等。开发一旦在这些地方使用协程就会出现内存错误,整个系统就会崩溃。

Swoole 3.0 本来是我们非常寄予厚望的一个版本,目标就是解决兼容性。核心的技术原理是基于 PHP 的 ZendVM 底层中断机制实现协程。大家有兴趣的话,可以了解一下 fiber-ext 这项目,3.0 的核心代码就是从 fiber-ext 项目借鉴的,这份源码是由 PHP 内核作者 Dmitry 亲自写的。3.0 开发完成后,测试中发现只能解决一小部分兼容性问题,有些 PHP 语法还是不支持的。

最终只能放弃了 3.0 分支,启动了 4.0 的开发,4.0 的技术方案是 PHP+C 双栈模式,这个技术方案解决了所有兼容性问题。协程终于可以像一个最普通的 PHP 函数一样,可以随时随地的使用了。

Q:Swoole 4.0 最初是基于 libco 做的协程,最终为什么又放弃了?

一开始我们确实使用了微信开源的 libco 库作为 C 栈协程库,但到了压力测试阶段发现大量并发的情况下会崩溃。使用 valgrind 内存检测发现了不少 invalid read/write 问题。因此在最终的版本中,我们移除了 libco ,使用了完全自主研发的 C 栈协程库。现在可以说底层代码的粒度非常细。这为 Swoole 后续的开发打下了非常好的基础,我们可以把控程序的每个细节,可以持续优化改进完善每一行代码,实现更多底层特性。

Q:社区上经常有用户吐槽 Swoole 的文档不够详细,上手难度高,后续会在文档这块做一些补充和完善吗?

确实有很多用户吐槽 Swoole 的文档。这是有原因的,Swoole 本身要求开发者具备有一定的 Linux 系统、异步 IO 和网络通信编程功底。Swoole 版本迭代地特别快,很多文档写出来没多久很快就过时了,开发者看起来会比较累。还有就是 Swoole 核心的几个开发者都是兼职工作,没有太多精力去好好地写文档。现在我们 4.0 的版本已趋于稳定,不再会有大的变动。而且近期我们会组建全职开发团队,在文档、教程、测试方面投入较大的资源,相信很快这些问题都会被解决掉。

Q:Swoole 下一步的主要方向是什么?目前似乎有多条版本分支在同时维护,在选择上有什么建议?

Swoole 目前已经迭代到了 4.0 版本,这个版本已经接近了我们心中预期的最终形态。Swoole 4.0 完整地实现了 CSP 并发编程模型,可以像 Go 语言的 goroutine + chan 一样灵活。而且 PHP 作为一门动态语言,相比静态语言在编程效率上是有很大优势,使用 Swoole 4 + PHP 实现协程+通道的 CSP 并发编程,可以说是一件非常舒爽的事情。

4.0 版本将会作为我们的主干版本进行开发和支持,1.x 和 2.x 分支已经进入了仅修复 BUG 的阶段,不会投入过多精力。如果已上线运行的项目使用了旧版本,那建议还是使用老的分支。新项目我还是建议大家使用 Swoole 4.0 。

Q:现如今技术迭代速度非常快,但许多开发者往往因为团队及个人的一些原因,导致无法及时跟进和采用,对于这种现状,您怎么评价?对于新技术、新版本,您的做法是什么?

程序员是一个活到老学到老的职业。技术的更新换代是不可避免的,就算是我们已经应用多年的软件,比如 Linux、Nginx、PHP、MySQL 都在不停地变化。所以我认为作为程序员必须要保持一个拥抱变化的心态。

对于新技术、新版本,也不是说一定要去升级更新。但了解和尝试还是很有必要的,如果这个新技术或新版本提供的新功能很有吸引力,或者修复了重要的 BUG ,并且在开发测试环境进行了足够多的试用,那就可以考虑升级更新。如果现有功能已经可以满足需求,并且可以稳定运行无问题,这样是没必要升级的。

Q:您去年曾写过一篇“2017 PHP 程序员未来路在何方”的文章,不知道今年有没有计划出一篇 2018 的呢^_^?对于 PHP 开发者,有没有一些经验和看法分享?

最近我们团队一直正在全力开发 Swoole 4 的版本,没有太多空闲时间,接下来可以抽空写一篇 2018 年的版本。

编程技术分成不变和变化的两个部分:计算机的基础就是不变的部分,所以作为程序员必须要持续夯实基础,不断提高姿势水平。比如 2018 年前半部分我一直在学习编译原理。而变化的部分就是各种新的工具、框架、组件以及新的方法,所以开发者经常登录技术社区网站,比如开源中国^_^,多参加一些技术大会了解业界新动态。我在今年也学习了 llvm、docker/k8s 这些新的技术。

举报
王练
发帖于3周前 28回/4K+阅
顶部