惠新宸php教程_百度PHP高级顾问惠新宸:PHP在百度的发展历程
惠新宸,百度PHP高級顧問,年二十有八,好追根究底,有不良嗜好, 幸性本善。乙酉年識互聯網,丁亥年入雅虎,翌年入百度。雖性好安穩,然經變無數,唯常嘆人生,菠菜湯爾。 大家好,今天我主要介紹是PHP在百度一個發展歷程,最早的時候百度成立于2000年,2000
惠新宸,百度PHP高級顧問,年二十有八,好追根究底,有不良嗜好, 幸性本善。乙酉年識互聯網,丁亥年入雅虎,翌年入百度。雖性好安穩,然經變無數,唯常嘆"人生,菠菜湯爾"。
大家好,今天我主要介紹是PHP在百度一個發展歷程,最早的時候百度成立于2000年,2000年的時候,百度剛剛成立,剛剛在北大資源賓館建立百度,直到2001年的競價排名,我不評價這個產品怎么樣,競價排名當時是第一個采用PHP,在百度的PHP系統。從2001年到今年已經10年時間了,這10年時間百度PHP經歷一些什么變化呢?
我們現在看到是百度,那天我自己腦子里想了一遍,當然不是全部,大家能夠知道的一些用戶產品,無線產品,商業產品。包括貼吧這個比較大了,還有最新的旅游。對于貼吧來說,前端可能是CUI,或者業務邏輯,一直到后來已經遷到PHP。我列出來這些產品,都是使用了PHP,還有沒列出來也是使用了PHP的,很多。所以,如果說讓我去介紹每個產品是怎么用PHP的,我覺得這個不太現實,我一共只有30分鐘。
這30分鐘我主要想跟大家分享的我們發現一些問題和怎么去解決,這些問題是大家都會遇到的。我們最早的時候,就像我剛才提到的我們一些,因為處于最高性能要求,以及對于PHP的不了解,以及對于外部我們可能覺得PHP很慢,所以我們以前的時候,這些大的訪問量產品都是用C來做的。他可能在模板上用Cu-i來做展現,這樣的方式大家都知道開發,調試,部署都很復雜,成本也比較高,門檻也比較高,招人也比較難招。
后來的時候我們就考慮是不是應該去換一個,當時應該考慮要是JAVA,或者是PHP。我們在C的時候,C-ui和后面進程去通訊主要是Nsheader和mcpack,類似于上面一些打包傳輸的方式。我們為什么選了PHP?第一高性能,快速開發要求。我這說高性能,可能下面有一些工程師就笑了,你PHP講什么高性能。我說的這些高性能是在相對情況下高性能,當我們WAP應用程序不僅僅局限PHP,瓶頸更大在于數據和文件,以及這些IO方面,在這些方面來說,PHP性能已經足夠了。
那么開放開發就不用說了,PHP不需要編譯,不依賴于環境,我所改即所建,改了就能看到,這個調試開發過程非常快,這是一個優點。穩定性,路棒性,安全性,怎么講呢?有一個玩笑,我跟我們百度幾個同學去聊天,他們就抱怨,PHP工程師真的是這個質量層次不齊,再爛的PHP工程師寫出的代也能跑,跑完了也正常。這是從一個方面,可能他的本意是說我們招聘有一部分人水平本來不一樣。但是從另外一個方面,也體現出來PHP一個特點是什么呢?穩定,魯棒性很強。再爛,再不懂PHP的新手去寫,你也不會把它寫垮掉。
說到這里我有一個小問題,大家知道怎么PK掉一個PHP進程嗎,最簡單的方式。其實這個問題還挺難的,我跟我的朋友講,你們說怎么PK掉一個PHP進程,我需要調試,其實很簡單你寫一個無線遞歸下去就會打掉。PHP有很多安全措施,比如我們頗為被人爭議GPH選項,打開之后會對客戶進行過濾。還有PHP對輸入做各種各樣的轉換驗證,這方面PHP對安全性考慮也是多的,當然還有是不建議打開的,那樣的話更安全。
靈活和豐富的語法就不用多說了,一個PHP怎么寫,不需要特定格式,隨意性也非常強,功能當然也很多了。他應用面這么廣,自然是一個例證。良好的運行在Linux,可擴展C/C++。PHP經典搭配是沒有問題的,我們都知道,我們當時不選擇JAVA一個原因,還有一方面考慮,JAVA那套開發環境比較復雜,重啟一下需要30-40秒。更重要一點可擴展,因為我接下來講的問題就是從可擴展來的,我們的優化方案。
當時我們就想因為PHP應用很多,一個開源東西,有很多方便第三方房展,我們經常用的PDO,都是擴展的方式,并且他的擴展也非常容易開發,網上有一堆教程,只要你照著教程做一遍。因為PHP對擴展做的很好,一行命令把自己代碼寫進去,就是一個很完整的擴家,一個擴展就能用。易部署,易調試,更不用說了PHP直接拷貝,拷貝到哪都能夠運行,不需要依賴系統的共享庫,不會因為庫的掛接處而出現問題,調試也很容易調試,最經典的方式不停調試,我們還有一個PHP調試技術手冊,我相信在座很多人都看過,那里面介紹一段做單布跟蹤調試,這樣的調試今天在這里講,效率往往還不如直接調試快,當時只是一種嘗試,或者說一種探索去跟大家分享調試的技術。
展現邏輯分離這個也很重要,對于PHP來說,本身生來就是做WAP開發的,可以把PHP代碼嵌入到WAP里面去,這個非常適合于做外部開發的。入門快,剛才也提到了,我們現在招聘新來這些大學生其實他以前可能是做JAVA,是做C,一周時間就可以開始寫。所以,入門非常快,社區活躍,這里我要提一下,在我們百度就我所知有400多名做PHP開發,我們這400多名工程師都在一個群里,大家聊天,問一個問題立馬就有人來回答你,這只是在百度社區,更不用說開源社區活躍程度了。
從這些方面我們就覺得PHP替換現在C的方式是可行的,于是我們就有了經典的方案,就像我這大家看到的,用戶瀏覽器經過的分發,分發以后后臺就是這樣一個用PHP腳本,下面可能有一些擴展,再下面就是PIP,后面數據,因為這塊對于開發來講,我這塊主要從貼吧角度來講,它是服務其邏輯數據還是用一些比較快的,還是以前那套老東西,只不過把UI這一塊做到PHP,當然其他系統不是這樣。
這個時候后臺像Web Services等等提供這種數據,給PHP腳本,這是一個現在這樣一個,應該說比較經典PHP開發模式,或者在我們百度來說,主要還是以這種方式,PHP只是做展現。這樣的情況下有一個問題,什么問題?比方說你是一個PHP工程師,你的上級交給你一個任務,你去寫一個什么樣的系統,你把它部署下去。你剛來很有信心,沒問題我去做,你用了一周時間寫出來,寫完之后你用一天時間把環境搭起來,把代碼放上去,四臺服務器需要共享,把這些東西都用完你可能用一周半時間,沒有問題你這個做的很好,你這個東西也很正常,架構也設計很好。
現在這樣的問題還有100個你怎么辦?難道你再去部署100次,這不行吧。另外你做的東西放上去之后,你可能出去玩了,下班回家了,那怎么監控呢?誰去監控呢?這也是現在單個產品線都要遇到的問題。還有一個問題資源流量陡增,比方說你這個產品挺好的,日均PV10萬,突然一天漲到100萬,大家都知道去年的時候69圣戰,貼吧經過一次所謂69圣戰,流量爆增了多少不知道,但把服務器給壓死了。
那么遇到流量陡增怎么辦,不能說現在這個產品10萬,前臺上了100臺前臺機,我告訴老大,我這個流量某一天陡增10誰信啊,成本也受不了這也是一個問題。規范和標準,這是最頭疼的,我到百度以后參與了很多規范制定,也會提很多意見,我每次做這些事情的時候我都是信心慢慢的,我覺得做完之后大家看了之后會去用,會去學,可能咱們普遍共同語言就會多一點。但是發現你標準規范制定出來沒人理,這就是規范一個怎么去執行,當然這個問題很難了,另外一個問題,這也是我們現在遇到的問題,我們有編碼規范,有部署規范,有目錄規范,但是沒有辦法推卸,沒有一個東西去強制讓他們這么去做。
還有防攻擊容災,你有4臺前端機,僅僅4臺,某個不知名相關組織弄了100多臺僵尸肉雞去壓你,你有什么辦法,沒有辦法,你只能被攻擊。還有一個問題,我們現在產品線這么多,每個產品線使用的框架各不相同,開發模式各不相同,這就造成他們都是異構的,異構會有什么問題,OP會很郁悶。OP遇到每個產品線,有的配置文件在這放,有的配置文件在那放,就像我們UC就得為各種各樣框架命名規則開發一個不同類庫。快速開發我就要求我的基礎設施足夠豐富,我基礎設施足夠豐富的情況下才能做到快速開發,我框架功能要很強,這樣開發才會快。
但是你框架功能很強就帶來一個問題,你代碼多,就慢,PHP就這樣,怎么辦,這也是一個根本矛盾。這些問題有沒有解決方案呢?當然是有的,要不然我也不會拿出來講了。在百度現在對于前面的問題,比方說運維,部署和容災,一些流量陡增這些問題怎么辦呢?看最右邊一個Bae,就是百度應用開發平臺,在這個上面會做一些類似于Gae,Sae這樣的東西,目前來說只是百度內部用。這樣的話當我用了這個東西之后,我們開發者不再要求需要關心資源,也不需要關心被攻擊,或者流量陡增,這個我待會還會講。
我們在PHP這層加了一個小螃蟹,它的名字叫做AP,我待會會介紹AP是什么樣東西。然后在腳本和PHP之間又加了一層Odp,又是什么東西?這三個就是解決我剛才提到哪些問題。Bae,我剛才提到是來解決我們剛才說的那些問題,比方說我資源怎么管理,流量陡增沒法應付了怎么辦。Bae把所有資源統一調度起來,提供一個很大平臺給你,你其中只用一部分,他會把冗余資源調配節給你,滿足你陡增的資源需求。
集群化還有一個問題是防攻擊,我現在是三大服務器有人來壓我了,他拿100臺肉雞來壓我,沒有關系,我們百度后面還有1千臺服務器呢,上,你再來壓。如果他真的強大到拿1萬臺,1千萬臺來壓你,這樣成本在國內很難做到。所以,這樣情況下能解決我們剛才所說小規模攻擊,因為你攻擊我就可以遷移,我可以自動遷移。
流量陡增也是一樣道理,太多。接下來就是今天我要介紹的重點,就是怎么解決沉重的框架問題。我們現在用的很多框架,各個公司開發都會有用框架,也有自己開發框架。在做開發框架的時候大家都會遇到一個問題,這個框架要不要做的這么重,為什么要做的重呢?因為你工作要提供的多,要提供路由,提供搜索引擎,還有ORM等等這樣東西。我提供這么多東西,必須有這么多的代碼,我有那么多代碼,就那么多邏輯,就有一個結果慢了下來,怎么取舍呢?
對于百度來說,我們現在解決方案出來之前流行兩種開發模式,一種比較成熟E框架,或者ZF框架,還有性能要求比較高的,會使用我們百度自己開發的B-Gou框架,只做路由,是一個輕量級框架,是一個非常非常輕量框架,來滿足性能問題。有沒有一個解決方案做他們倆的取舍呢,下面有一個擴展化。
什么是擴展化?在座都知道PHP擴展,如果關心這個肯定會知道,可能也有不知道同學,我就提一下什么是PHP的擴展。PHP本身是用C語言寫的,你所編寫的PHP腳本到最后都是通過C代碼執行的,這時候PHP還提供一種方式可以直接寫用C來寫一個共享庫,動態的共享庫,把它加載到PHP中,通過這種方式讓你業務模式以C模式存在在PHP當中,這個模式就叫擴展,PHP提供一個很強大模塊來支持你自己PHP擴展。
我剛才提到了其實問題也就很明顯了,我們需要用一個PHP擴展去做一個很重的PHP框架。還有一個要提的,什么樣的情況下我們應該使用擴展,還有一個問題擴展為什么會快,這兩個問題,有些看似很簡單問題,其實要想起來還是挺難的。第一什么樣的情況下我們可以使用擴展,我們有兩種方式是需要擴展,第一種方式我們有一些,比方說已經成熟的C庫,我們PHP許多辦法直接用,我必須用一個擴展把它橋接過來,這種情況下需要使用PHP擴展。
還有一種情況我對CPU密集型的東西,比方說我有一個算法,或者我有一個很復雜,很復雜的加密算法。這個算法如果我用PHP寫的話非常慢,對于這種CPU密集型的東西,我是可以把它擴展化用C來實現,這樣的話能提高性能,就這兩種方式要去使用PHP擴展。PHP擴展為什么會快呢?這里我要提一下FaceBook極致,去年11月份極致把一個應用性能提高到4倍,他是怎么做到的呢?我們大家聽各種各樣報告,是把PHP編譯成C++,他這個編譯其實不是說我根據你的邏輯找到對應的C代碼進行編輯,他做的更多是把這個符號解析給拿掉了。我們在PHP里面,我們的變量,我們的函數都是存儲在一個一個關聯數字結構里面,他這個結構設計足夠精妙,確實也花很大心思去設計,但是當我們使用一個變量,或者一個方式的時候,都需要從這個表里面去查的,這個過程是非常耗時的。
所以,PHP性能絕大部分低也是這個關鍵。PHP就把能在編譯期間確定的符號就把它直接替換掉,相當于我們C程序編譯的時候把符號直接換成二進制地址的一樣,就是一個符號回天。這只是一方面,還有一方面為什么擴展會比PHP快?這個我們拋開一切問題,一切IO,拋開一切內存存儲我們來算一個簡單算術題,一個1G赫茲CPU能編織多少,這也是PHP比較慢一個原因。
比方說一個簡單ICOU(音譯),如果你用C代碼來寫,直接寫ICOU2也可以,如果PHPICOU2先編譯,第二部分先分析這個PHP,找到對應PHP調用,這個時候有三種情況,這時候拿到一個指令進行執行,當執行這次指令的時候可能會發生多次調用。我一個簡單的ICOU可能在PHP最后執行的時候,可能有5次以上函數調用,這個就慢了,擴展化就可以避免這些問題。
我們Ap就是一個全功能MVC框架,是用擴展來實現,也就是利用C語言去寫的一個PHP擴展。這個地方又有一個問題,我們擴展一般也兩種理由去寫擴展,擴展還分兩類,第一類就是說一個簡單我的業務邏輯都是用C代碼去做的,我只是簡單從PHP腳本拿到數據,把處理結果反給PHP,我基本上不怎么使用Ap。第二個擴展就是負載PHP擴展,就是Ap,用了大量API,提供相應存量,或者是一些資源給PHP腳本讓用戶去進行使用。
本文原創發布php中文網,轉載請注明出處,感謝您的尊重!
總結
以上是生活随笔為你收集整理的惠新宸php教程_百度PHP高级顾问惠新宸:PHP在百度的发展历程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在VC中创建动态数组
- 下一篇: 等待一个线程的结束