php轉go?還是php+swoole?



一個老 PHP 程序員建議直接轉 go。

我是在 2021 年夏天轉 go 的。在那之前,寫了很長時間的 php,對這門語言有很深的感情。

php 是我在大學里學的第一種腳本語言。當時流行的是微軟的 asp 和 java 的 jsp。jsp 太麻煩,微軟的東西我又很排斥,然后就在圖書管找到了 php 的參考資料。當年我買了第一本 php 教程。你沒看錯,當時是有一個 PHP6 的。后來跳票,最終被 PHP7 取代了。

 

我從這本書學到了使用 PHP 動態生成 html 技術。當時驚為天人,原來還可以這樣玩。可以說這本書為我打開了新世界的大門,甚至決定了我畢業的職業生涯。書里的有一些PHP6相關內容確實過時了,但大部分內容是版本無關,非常經典。到今天也值得閱讀。

畢業后我的首份工作就是 PHP 開發,當時 PHP 程序員還是相對稀缺的,所以我也順利拿到 offer。

php的出身定位是web,簡單快速,線程的維護較為復雜,用進程來維護反而就簡單很多,所以php_fpm會開啟多個進程,底層的東西交給虛擬機去完成,所以說php不是不支持多線程,是大多數的框架都是基於php_fpm,gci統一網關的方式,進程級別的。

從最早搞 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 的已經很少了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM