最重要的一句話: 未來,PHP開發可能是最好的業務系統服務端編程語言。
PHP作為服務端開發的主要語言之一,使用廣泛。很多網站或者APP的服務端都是用PHP開發的,其中不乏有像百度、新浪之類的大廠。那么,大廠是怎么用PHP開發業務的呢?結合自己的工作經驗和了解到的一些情況,簡單說一說。
1、場景
如果你自認為自己是做PHP開發的,那么,請回顧一些自己都用PHP做過一些什么樣的事情呢?相信絕大多數PHP工程師尤其是很多初學者,都會回答用來寫網站或者服務端。甚至還會有人在基于PHP和前端代碼混雜的方式寫界面,這是常態。但是,作為一門語言,難道PHP只能寫網站或者服務端接口嗎?
其實,從我自己的工作經歷來看,用PHP來做數據清洗、數據統計甚至流式計算的場景,也并不少。比如,剛開始實習和工作的時候,參與的幾個項目里面,大量的用PHP+crontab定時任務來實現數據的ETL或者數據的定時統計功能。如果不知道什么叫crontab,大概你需要去翻翻Linux相關的書籍或者網站了。再比如,業界公開分享過的,鏈家用strom+PHP 做流式計算,這樣的例子在百度也存在很多。再比如用redis做消息隊列,然后啟動若干PHP常駐進程來消費隊列里面的數據做類似實時計算之類的數據清洗;基于PHP實現一些簡單的爬蟲功能,并基于此來做網站或者接口的可用性監控;基于PHP構建自動化測試用例……等等。
2、框架
PHP語言框架眾多,諸如ThinkPHP 、Yii、Laveral、Symfony、CI、Yaf等等,很明顯的一個問題是,PHP做網站開發的框架比Java做網站開發多很多。大概是PHP這門語言太容易造輪子了。各大廠選擇PHP框架也是多種多樣:比如,新浪,之前因為有鳥哥的存在,PHP部分主要用yaf;比如途牛,PHP層面主要用Yii,比如百度,也是因為很久之前有鳥哥的存在,使用一個與yaf基本沒太多差別的框架,只是在內部不叫yaf罷了,可以認為yaf是百度內容框架在開源界的產品。當然,還有很多公司選擇自己造輪子,基于Cmposer獲取很多基礎庫然后拼一拼就組成了一個框架,比如,孫紅雷代言的某二手車電商。
3、語言及周邊
看到語言部分,可能很多人會說,不就是PHP嘛,為什么還要說語言。其實,大廠除了PHP之外,還有很多其他的選擇。比如,以百度為例,因為之前PHP版本性能問題的原因,一直在尋找能夠既能利用PHP開發效率高的優勢,又能提高PHP執行性能的方案。所以,在很多人很多年的努力之后,百度終于將高大上的HHVM,搬到百度很多業務的運行環境上面。當然,那個時候,很多公司因為基礎技術研發投入的原因,基本還停留在PHP5.*的版本上,直到這兩年PHP7正式發布,很多公司,比如新浪微博,才逐漸找到了可以與HHVM性能持平的語言性能解決方案。關于HHVM是啥,基本就是臉書大神趙海平先生以前鼓搗的那套hiphop的東西,后來逐漸演變成了hhvm。多說一句,趙海平先生以前就讀于清華,好像是學生物的,后來在臉書工作期間因為搞出了hiphop而名聲大噪,后來被挖到阿里做研究員去了,據說還是專注于研究性能方面的東西,此大神實在是我等非科班出身的程序員的學習榜樣。
除了語言之外,說一下語言周邊。比如,很久之前,百度為了提升在線業務的運行性能,調研了很久之后,最后采用把原來一種舊的服務器換成Nginx的方式,來提升系統性能。再比如,yaf,在一定層面上,也是框架性能方向的一種產物。后來,出于語言性能層面,將hhvm搞到線上業務運行環境,則屬于語言性能方向的成功探索和實踐。再比如,近期比較火的PHP擴展swoole,也是一種新的語言周邊的技術基礎設施,這東西的出現給PHP的未來發展增加了很多的可能。比如,基于擴展支持協程、更強的網絡通信、自帶http服務器等等。但是這東西,據我了解,除了幾家公司并且是部分業務使用外,離全量鋪展到線上業務,完全成為類似mysql.so這樣的基礎性擴展還有很遠,最起碼,在百度是這樣。
4、服務化
說道服務端開發,尤其是一些大廠的業務,都比較復雜,就不得不提一個事情,那就是服務化。這個方向最近還有一個非常熱的名次,叫微服務,也是一種新的趨勢。服務化的基本思路是,原本需要在一個接口或者一個模塊里面寫一大坨代碼的邏輯,通過合理拆分,拆接到不同的模塊里面去,并且通過調用模塊暴露的特定協議的接口,來將原本冗雜的業務黏合在一起。
在這個方向其實有很多不同的做法。比如,類似途牛之類的電商業務的公司,他們采用的方式是,最底層的服務化,或者叫平臺化,采用Java技術體系的東西來實現,然后中間層用類似yii或者yaf之類的框架做一層業務層,或者叫黏合層,對底層的服務接口進行封裝,然后給前端暴露http接口供前端使用;也有一些公司,喜歡把最底層的東西用C++實現,剩下的中間層同樣基于PHP做一層黏合;當然,還有一種情況,那就是無論底層的服務層還是中間層的業務黏合層,都用PHP來搞,比如百度的很多業務都是這個樣子。
服務化少不了中間件,上面說了百度的一些業務無論服務層還是業務層,都用PHP來搞,一個非常重要的原因就是百度的基礎中間件比較完善,無論rpc、資源定位和服務發現、還是資源收斂都有很多非常可靠的基礎中間件來搞定。當然,關于這些中間件,開源界也有很多其他的方案,比如,鳥哥的yar,基于swoole開發的dora等等。
5、運行環境與運維
曾經有個朋友入職某廠,有一天我們聊到一般剛入職都做些什么的時候,朋友告訴我說,在那家公司,前兩天主要在配置開發用到的各種lamp或者lnmp環境。囧。
在這方面,大廠的做法是怎么樣的呢?相信很多人搭建博客的時候用過一個一鍵部署lnmp環境的安裝包。很多大廠里也是類似。以百度為例,基礎的lnmp開發環境是一個融合好的,組合了nginx\php或hhvm還有各種中間件和擴展以及其他的輔助模塊的安裝包,新人入職的時候wget一些需要使用到的版本的安裝包然后執行兩三個啟動腳本,環境基本就搭建結束了。其實這個融合包,絕大部分跟外面的一鍵搭建環境很相似,主要是融入了一些公司基礎的中間件。當然,也有一些不同,舉個例子,你是怎么解決在一臺機器上搭建多套PHP運行環境的?環境與環境之間沒有相互組件依賴,不相互影響。有思路嗎?建議去lamp.baidu.com上看看,說不定會有一些發現。
還有一個問題,就是PHP的運維的問題。大廠一般都是基于Paas平臺來解決這樣的問題。業界很多公司,比如頭條等等都是基于Docker的解決方案來做資源隔離、服務化以及資源使用率提升。百度也是類似,不同的是,百度最底層并不是基于Docker,而是一種同樣基于cgroup的資源隔離基礎上的獨特資源調度和解決方案。基本可以認為是一臺原生服務器上可以啟動若干個坑,好吧,英文叫container,然后每個坑里各自跑一套lnmp架構的組件,然后這套組件里面,自帶一些日志采集、配置熱加載之類的基礎設置,算是一些輔助的基礎設施吧。 ?業界也有越來越多的公司專注于上述類似的Paas云服務,比如靈雀云、DaoCloud等容器云平臺,當然也有一些做云遷移服務的云服務提供商,也能提供一些類似的解決方案,來解決長久以來PHP運維方面的痛點問題。
6、其他輔助設施
對于一個大型復雜的在線業務,尤其是在進行分布式和服務化之后,一般而言都是有很多基礎和輔助設施的。比如,前面提到的資源定位、服務發現是一類。當然,輔助設施并不只有這些,一些業界的,無論針對什么語言什么架構方案的基礎設施,在大廠里一個也少不了。比如,類似于谷歌Dapper和淘寶鷹眼的分布式鏈路追蹤系統、比如接口調用統計系統、自如,日志采集傳輸與統計解決方案等等,該有的,一個都少不了。關于這些基礎設施或者解決方案,如果有時間的話,其實每個都可以展開寫個幾千字。
7、PHP的尷尬
PHP還是世界上最好的語言嗎?很多人會認為這句調侃沒什么問題,并且回答是的。但是,相比于Js呢?想當年我入坑PHP的時候,就是因為參加阿里云的開發者大會,發現阿里和一些參會的公司好多都用PHP,而不是當時已經學會的.net、asp之類的微軟的技術。可是,當我大學臨近實習的時候,發現,阿里已經很少用PHP了,而是轉向了nodejs這套技術棧:相比于數據層用Java+業務層PHP+前端Js的組合,為什么不能直接用數據層Java+業務層node.js+前端Js的組合呢?后者在語言層面少了一層,同時帶來的,還有人員成本的較低,技術棧的簡化等等。
這就是PHP的尷尬所在:PHP在編程語言的定位層面,做偏前端的東西,不如Js和node;做偏后端的東西,又面臨著Java、C++、Go之類的語言的競爭;同時由于PHP的性能問題與功能局限等問題,導致其在表面被人調侃為世界上最好的語言的浮冰之下,潛藏著巨大的市場和使用場景危機。好在,如前面提到的,swoole之類的擴展正在逐漸彌補PHP在網絡編程、協程編程等方面的功能短板;同時諸如yaf、swoole、PHP-JIT等技術的逐步發展,也在漸漸的把PHP在性能方面的問題進行逐步改善。
總結
未來,PHP開發可能是最好的業務系統服務端編程語言。 解釋請看正文,就醬。