天天看點

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 語言的時候,我是拒絕的。

php轉go?還是php+swoole?

但到了 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 等),而是在糾結一些不是很重要的問題。

  • 比如引入了對枚舉類型的支援 ​​rfc:enumerations​​
  • 比如添加了 is_list 方法 ​​PHP: rfc:is_list​​
  • 比如搞了一個 noreturn 類型 ​​rfc:noreturn_type​​

不能說這些改動沒用意義,但确實是可有可無。相反,Go 社群則在引入泛型的支援,改用寄存器傳參以進一步提高性能,不斷改善 gc 延時,優化 defer 執行效率。Go沒有太多文法糖,但社群卻在實打實把精力放到核心元件上。這讓我也覺着 PHP 真是有點日薄西山的意思了。

那 PHP 語言就沒有優點嗎?肯定有。PHP+MySQL積累了大量的社群财富,像 WordPress 等重量級的應用都是 PHP 開發的,PHP 社群也有像 Laravel 這樣優秀的架構。如果你懂 PHP 而且能招到人,那使用PHP快速搭建系統原型是很友善的。但我們也要看到這隻是一種曆史慣性。随着Go語言的崛起,越來越多的人轉Go,現在PHP程式員也越來越難招。最終PHP社群會不斷消亡。現在還用PHP的,不是維護老系統,就是希望你轉Go或者Java。新系統用 PHP 的已經很少了。