php转go?还是php+swoole?


一个老 PHP 程序员建议直接转 go。

我是在 2021 年夏天转 go 的。在那之前,写了很长时间的 php,对这门语言有很深的感情。

php 是我在大学里学的第一种脚本语言。当时流行的是微软的 asp 和 java 的 jsp。jsp 太麻烦,微软的东西我又很排斥,然后就在图书管找到了 php 的参考资料。当年我买了第一本 php 教程。你没看错,当时是有一个 PHP6 的。后来跳票,最终被 PHP7 取代了。

 

我从这本书学到了使用 PHP 动态生成 html 技术。当时惊为天人,原来还可以这样玩。可以说这本书为我打开了新世界的大门,甚至决定了我毕业的职业生涯。书里的有一些PHP6相关内容确实过时了,但大部分内容是版本无关,非常经典。到今天也值得阅读。

毕业后我的首份工作就是 PHP 开发,当时 PHP 程序员还是相对稀缺的,所以我也顺利拿到 offer。

从最早搞 apache + mod_php,再后来搞 nginx + php_fpm,再后来是 php + swoole。从 composer 到 psr,从开发 php 业务代码到写 php c 语言扩展。甚至还想着给 php 添加 fiber 支持(最终失败了,但 PHP 8.1 引入 fiber 支持,大赞)。有一段时间我希望所有的功能都用 PHP 实现。

所以在2017年有同事向我推销 go 语言的时候,我是拒绝的。


但到了 2018 年,当我有机会从零开始构建业务系统的时候,我开始认真考虑还用 PHP 是否合适的问题了。最终我的结论是「Go(至少)是更好的PHP 」

 

像 PHP 这类动态语言,开发效率方面快则快矣,但后期的维护成本非常高。PHP 的 Zend 虚拟机本身性能比较差(现在支持 jit 了,但效果有限)。PHP 的垃圾回收使用的引用计数法。为了解决循环引用的问题,不得周期性的停止运行扫描可疑对象(也就是所谓的 stop the world)。如果使用 fpm,那必然伴随着资源的反复申请与销毁;如果使用 swoole 这一类的常驻组件,那要留心内存泄漏的问题。此外,如果 PHP 程序员想更进一步,则需要学习 c 扩展等知识。PHP 社区很多关键的功能都需要 c 语言。c 语言跟 PHP 又差别太大,一般程序员很难完成这一步跨越。

而 Go 语言则几乎囊括了 PHP 的优点而且基本没有对应的缺点。Go虽然也有GC,早期也有 stop the world 的问题,但现在已经不是什么问题。Go语言虽然的强类型的静态语言,但支持类型推导,写起来也不比 PHP 更麻烦。做为一个基础平台,Go没有虚拟机的解释运行开销,可以最大程度利用CPU,这是PHP很难望其项背的。Go语言本身实现了自举,其本身源码是Go代码加上少量汇编。如果程序员有心深入学习,比PHP程序员学 c 语言要容易多了。

那 Go 语言就没有缺点吗?肯定有。在 2018 年的时候,Go 社区还没说要支持泛型,所以在有些场景下需要写很多重复的代码。这确实是一个劣势。但 Go 内置的 map 和 slice 支持声明类型,再辅之以接口和 interface{},基本可以应该常规业务。这个我在文章里已有分析。现在是 2021 年了,再过半年,Go1.18就会支持泛型,到时候 Go 语言就没有什么硬伤了。

要说起并发和网络编程,很少有语言可以跟 Go 语言 PK,PHP则更是不入流。Swoole 的高性能也仅仅是沾了常驻内存的光。只要是常驻内存的方案,比如 amphp 或者 php-pm,性能都甩 php-fpm 几条街,不是它们有多优秀,而是 php-fpm 太慢了。这些性能跟 Go 相比还是差太远。无论这些方案多么精巧,都摆脱不了 Zend 虚拟机的限制:jit 不行、gc 不行。

我现在已经很少写 PHP 了,但依然关注 PHP 的发展。最令我期待的就是 8.1 的 fiber 特性,这是社区对 swoole 这一类方案的回应。到时候 swoole 方案应该会逐步退出历史。但讲道理 PHP 社区并没有着手解决困扰 PHP 的核心问题(jit 和 gc 等),而是在纠结一些不是很重要的问题。

不能说这些改动没用意义,但确实是可有可无。相反,Go 社区则在引入泛型的支持,改用寄存器传参以进一步提高性能,不断改善 gc 延时,优化 defer 执行效率。Go没有太多语法糖,但社区却在实打实把精力放到核心组件上。这让我也觉着 PHP 真是有点日薄西山的意思了。

那 PHP 语言就没有优点吗?肯定有。PHP+MySQL积累了大量的社区财富,像 WordPress 等重量级的应用都是 PHP 开发的,PHP 社区也有像 Laravel 这样优秀的框架。如果你懂 PHP 而且能招到人,那使用PHP快速搭建系统原型是很方便的。但我们也要看到这只是一种历史惯性。随着Go语言的崛起,越来越多的人转Go,现在PHP程序员也越来越难招。最终PHP社区会不断消亡。现在还用PHP的,不是维护老系统,就是希望你转Go或者Java。新系统用 PHP 的已经很少了。

 

上一篇:swoole--WebSocket


下一篇:Codeforces Round #739 (Div. 3) 题解