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