乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      惠新宸:PHP在百度的應(yīng)用現(xiàn)狀及展望

       londonKu 2012-06-23

      惠新宸,百度PHP高級顧問,年二十有八,好追根究底,有不良嗜好, 幸性本善。乙酉年識互聯(lián)網(wǎng),丁亥年入雅虎,翌年入百度。雖性好安穩(wěn),然經(jīng)變無數(shù),唯常嘆"人生,菠菜湯爾"。

             大家好,今天我主要介紹是PHP在百度一個發(fā)展歷程,最早的時候百度成立于2000年,2000年的時候,百度剛剛成立,剛剛在北大資源賓館建立百度,直到2001年的競價排名,我不評價這個產(chǎn)品怎么樣,競價排名當(dāng)時是第一個采用PHP,在百度的PHP系統(tǒng)。從2001年到今年已經(jīng)10年時間了,這10年時間百度PHP經(jīng)歷一些什么變化呢?

            我們現(xiàn)在看到是百度,那天我自己腦子里想了一遍,當(dāng)然不是全部,大家能夠知道的一些用戶產(chǎn)品,無線產(chǎn)品,商業(yè)產(chǎn)品。包括貼吧這個比較大了,還有最新的旅游。對于貼吧來說,前端可能是CUI,或者業(yè)務(wù)邏輯,一直到后來已經(jīng)遷到PHP。我列出來這些產(chǎn)品,都是使用了PHP,還有沒列出來也是使用了PHP的,很多。所以,如果說讓我去介紹每個產(chǎn)品是怎么用PHP的,我覺得這個不太現(xiàn)實(shí),我一共只有30分鐘。

            這30分鐘我主要想跟大家分享的我們發(fā)現(xiàn)一些問題和怎么去解決,這些問題是大家都會遇到的。我們最早的時候,就像我剛才提到的我們一些,因?yàn)樘幱谧罡咝阅芤?,以及對于PHP的不了解,以及對于外部我們可能覺得PHP很慢,所以我們以前的時候,這些大的訪問量產(chǎn)品都是用C來做的。他可能在模板上用Cu-i來做展現(xiàn),這樣的方式大家都知道開發(fā),調(diào)試,部署都很復(fù)雜,成本也比較高,門檻也比較高,招人也比較難招。

            后來的時候我們就考慮是不是應(yīng)該去換一個,當(dāng)時應(yīng)該考慮要是JAVA,或者是PHP。我們在C的時候,C-ui和后面進(jìn)程去通訊主要是Nsheader和mcpack,類似于上面一些打包傳輸?shù)姆绞?。我們?yōu)槭裁催x了PHP?第一高性能,快速開發(fā)要求。我這說高性能,可能下面有一些工程師就笑了,你PHP講什么高性能。我說的這些高性能是在相對情況下高性能,當(dāng)我們WAP應(yīng)用程序不僅僅局限PHP,瓶頸更大在于數(shù)據(jù)和文件,以及這些IO方面,在這些方面來說,PHP性能已經(jīng)足夠了。

            那么開放開發(fā)就不用說了,PHP不需要編譯,不依賴于環(huán)境,我所改即所建,改了就能看到,這個調(diào)試開發(fā)過程非常快,這是一個優(yōu)點(diǎn)。穩(wěn)定性,路棒性,安全性,怎么講呢?有一個玩笑,我跟我們百度幾個同學(xué)去聊天,他們就抱怨,PHP工程師真的是這個質(zhì)量層次不齊,再爛的PHP工程師寫出的代也能跑,跑完了也正常。這是從一個方面,可能他的本意是說我們招聘有一部分人水平本來不一樣。但是從另外一個方面,也體現(xiàn)出來PHP一個特點(diǎn)是什么呢?穩(wěn)定,魯棒性很強(qiáng)。再爛,再不懂PHP的新手去寫,你也不會把它寫垮掉。

            說到這里我有一個小問題,大家知道怎么PK掉一個PHP進(jìn)程嗎,最簡單的方式。其實(shí)這個問題還挺難的,我跟我的朋友講,你們說怎么PK掉一個PHP進(jìn)程,我需要調(diào)試,其實(shí)很簡單你寫一個無線遞歸下去就會打掉。PHP有很多安全措施,比如我們頗為被人爭議GPH選項,打開之后會對客戶進(jìn)行過濾。還有PHP對輸入做各種各樣的轉(zhuǎn)換驗(yàn)證,這方面PHP對安全性考慮也是多的,當(dāng)然還有是不建議打開的,那樣的話更安全。

            靈活和豐富的語法就不用多說了,一個PHP怎么寫,不需要特定格式,隨意性也非常強(qiáng),功能當(dāng)然也很多了。他應(yīng)用面這么廣,自然是一個例證。良好的運(yùn)行在Linux,可擴(kuò)展C/C++。PHP經(jīng)典搭配是沒有問題的,我們都知道,我們當(dāng)時不選擇JAVA一個原因,還有一方面考慮,JAVA那套開發(fā)環(huán)境比較復(fù)雜,重啟一下需要30-40秒。更重要一點(diǎn)可擴(kuò)展,因?yàn)槲医酉聛碇v的問題就是從可擴(kuò)展來的,我們的優(yōu)化方案。

            當(dāng)時我們就想因?yàn)镻HP應(yīng)用很多,一個開源東西,有很多方便第三方房展,我們經(jīng)常用的PDO,都是擴(kuò)展的方式,并且他的擴(kuò)展也非常容易開發(fā),網(wǎng)上有一堆教程,只要你照著教程做一遍。因?yàn)镻HP對擴(kuò)展做的很好,一行命令把自己代碼寫進(jìn)去,就是一個很完整的擴(kuò)家,一個擴(kuò)展就能用。易部署,易調(diào)試,更不用說了PHP直接拷貝,拷貝到哪都能夠運(yùn)行,不需要依賴系統(tǒng)的共享庫,不會因?yàn)閹斓膾旖犹幎霈F(xiàn)問題,調(diào)試也很容易調(diào)試,最經(jīng)典的方式不停調(diào)試,我們還有一個PHP調(diào)試技術(shù)手冊,我相信在座很多人都看過,那里面介紹一段做單布跟蹤調(diào)試,這樣的調(diào)試今天在這里講,效率往往還不如直接調(diào)試快,當(dāng)時只是一種嘗試,或者說一種探索去跟大家分享調(diào)試的技術(shù)。

             展現(xiàn)邏輯分離這個也很重要,對于PHP來說,本身生來就是做WAP開發(fā)的,可以把PHP代碼嵌入到WAP里面去,這個非常適合于做外部開發(fā)的。入門快,剛才也提到了,我們現(xiàn)在招聘新來這些大學(xué)生其實(shí)他以前可能是做JAVA,是做C,一周時間就可以開始寫。所以,入門非???,社區(qū)活躍,這里我要提一下,在我們百度就我所知有400多名做PHP開發(fā),我們這400多名工程師都在一個群里,大家聊天,問一個問題立馬就有人來回答你,這只是在百度社區(qū),更不用說開源社區(qū)活躍程度了。

             從這些方面我們就覺得PHP替換現(xiàn)在C的方式是可行的,于是我們就有了經(jīng)典的方案,就像我這大家看到的,用戶瀏覽器經(jīng)過的分發(fā),分發(fā)以后后臺就是這樣一個用PHP腳本,下面可能有一些擴(kuò)展,再下面就是PIP,后面數(shù)據(jù),因?yàn)檫@塊對于開發(fā)來講,我這塊主要從貼吧角度來講,它是服務(wù)其邏輯數(shù)據(jù)還是用一些比較快的,還是以前那套老東西,只不過把UI這一塊做到PHP,當(dāng)然其他系統(tǒng)不是這樣。

             這個時候后臺像Web Services等等提供這種數(shù)據(jù),給PHP腳本,這是一個現(xiàn)在這樣一個,應(yīng)該說比較經(jīng)典PHP開發(fā)模式,或者在我們百度來說,主要還是以這種方式,PHP只是做展現(xiàn)。這樣的情況下有一個問題,什么問題?比方說你是一個PHP工程師,你的上級交給你一個任務(wù),你去寫一個什么樣的系統(tǒng),你把它部署下去。你剛來很有信心,沒問題我去做,你用了一周時間寫出來,寫完之后你用一天時間把環(huán)境搭起來,把代碼放上去,四臺服務(wù)器需要共享,把這些東西都用完你可能用一周半時間,沒有問題你這個做的很好,你這個東西也很正常,架構(gòu)也設(shè)計很好。

             現(xiàn)在這樣的問題還有100個你怎么辦?難道你再去部署100次,這不行吧。另外你做的東西放上去之后,你可能出去玩了,下班回家了,那怎么監(jiān)控呢?誰去監(jiān)控呢?這也是現(xiàn)在單個產(chǎn)品線都要遇到的問題。還有一個問題資源流量陡增,比方說你這個產(chǎn)品挺好的,日均PV10萬,突然一天漲到100萬,大家都知道去年的時候69圣戰(zhàn),貼吧經(jīng)過一次所謂69圣戰(zhàn),流量爆增了多少不知道,但把服務(wù)器給壓死了。

             那么遇到流量陡增怎么辦,不能說現(xiàn)在這個產(chǎn)品10萬,前臺上了100臺前臺機(jī),我告訴老大,我這個流量某一天陡增10誰信啊,成本也受不了這也是一個問題。規(guī)范和標(biāo)準(zhǔn),這是最頭疼的,我到百度以后參與了很多規(guī)范制定,也會提很多意見,我每次做這些事情的時候我都是信心慢慢的,我覺得做完之后大家看了之后會去用,會去學(xué),可能咱們普遍共同語言就會多一點(diǎn)。但是發(fā)現(xiàn)你標(biāo)準(zhǔn)規(guī)范制定出來沒人理,這就是規(guī)范一個怎么去執(zhí)行,當(dāng)然這個問題很難了,另外一個問題,這也是我們現(xiàn)在遇到的問題,我們有編碼規(guī)范,有部署規(guī)范,有目錄規(guī)范,但是沒有辦法推卸,沒有一個東西去強(qiáng)制讓他們這么去做。

             還有防攻擊容災(zāi),你有4臺前端機(jī),僅僅4臺,某個不知名相關(guān)組織弄了100多臺僵尸肉雞去壓你,你有什么辦法,沒有辦法,你只能被攻擊。還有一個問題,我們現(xiàn)在產(chǎn)品線這么多,每個產(chǎn)品線使用的框架各不相同,開發(fā)模式各不相同,這就造成他們都是異構(gòu)的,異構(gòu)會有什么問題,OP會很郁悶。OP遇到每個產(chǎn)品線,有的配置文件在這放,有的配置文件在那放,就像我們UC就得為各種各樣框架命名規(guī)則開發(fā)一個不同類庫??焖匍_發(fā)我就要求我的基礎(chǔ)設(shè)施足夠豐富,我基礎(chǔ)設(shè)施足夠豐富的情況下才能做到快速開發(fā),我框架功能要很強(qiáng),這樣開發(fā)才會快。

             但是你框架功能很強(qiáng)就帶來一個問題,你代碼多,就慢,PHP就這樣,怎么辦,這也是一個根本矛盾。這些問題有沒有解決方案呢?當(dāng)然是有的,要不然我也不會拿出來講了。在百度現(xiàn)在對于前面的問題,比方說運(yùn)維,部署和容災(zāi),一些流量陡增這些問題怎么辦呢?看最右邊一個Bae,就是百度應(yīng)用開發(fā)平臺,在這個上面會做一些類似于Gae,Sae這樣的東西,目前來說只是百度內(nèi)部用。這樣的話當(dāng)我用了這個東西之后,我們開發(fā)者不再要求需要關(guān)心資源,也不需要關(guān)心被攻擊,或者流量陡增,這個我待會還會講。

             我們在PHP這層加了一個小螃蟹,它的名字叫做AP,我待會會介紹AP是什么樣?xùn)|西。然后在腳本和PHP之間又加了一層Odp,又是什么東西?這三個就是解決我剛才提到哪些問題。Bae,我剛才提到是來解決我們剛才說的那些問題,比方說我資源怎么管理,流量陡增沒法應(yīng)付了怎么辦。Bae把所有資源統(tǒng)一調(diào)度起來,提供一個很大平臺給你,你其中只用一部分,他會把冗余資源調(diào)配節(jié)給你,滿足你陡增的資源需求。

             集群化還有一個問題是防攻擊,我現(xiàn)在是三大服務(wù)器有人來壓我了,他拿100臺肉雞來壓我,沒有關(guān)系,我們百度后面還有1千臺服務(wù)器呢,上,你再來壓。如果他真的強(qiáng)大到拿1萬臺,1千萬臺來壓你,這樣成本在國內(nèi)很難做到。所以,這樣情況下能解決我們剛才所說小規(guī)模攻擊,因?yàn)槟愎粑揖涂梢赃w移,我可以自動遷移。

             流量陡增也是一樣道理,太多。接下來就是今天我要介紹的重點(diǎn),就是怎么解決沉重的框架問題。我們現(xiàn)在用的很多框架,各個公司開發(fā)都會有用框架,也有自己開發(fā)框架。在做開發(fā)框架的時候大家都會遇到一個問題,這個框架要不要做的這么重,為什么要做的重呢?因?yàn)槟愎ぷ饕峁┑亩?,要提供路由,提供搜索引擎,還有ORM等等這樣?xùn)|西。我提供這么多東西,必須有這么多的代碼,我有那么多代碼,就那么多邏輯,就有一個結(jié)果慢了下來,怎么取舍呢?

             對于百度來說,我們現(xiàn)在解決方案出來之前流行兩種開發(fā)模式,一種比較成熟E框架,或者ZF框架,還有性能要求比較高的,會使用我們百度自己開發(fā)的B-Gou框架,只做路由,是一個輕量級框架,是一個非常非常輕量框架,來滿足性能問題。有沒有一個解決方案做他們倆的取舍呢,下面有一個擴(kuò)展化。

             什么是擴(kuò)展化?在座都知道PHP擴(kuò)展,如果關(guān)心這個肯定會知道,可能也有不知道同學(xué),我就提一下什么是PHP的擴(kuò)展。PHP本身是用C語言寫的,你所編寫的PHP腳本到最后都是通過C代碼執(zhí)行的,這時候PHP還提供一種方式可以直接寫用C來寫一個共享庫,動態(tài)的共享庫,把它加載到PHP中,通過這種方式讓你業(yè)務(wù)模式以C模式存在在PHP當(dāng)中,這個模式就叫擴(kuò)展,PHP提供一個很強(qiáng)大模塊來支持你自己PHP擴(kuò)展。

             我剛才提到了其實(shí)問題也就很明顯了,我們需要用一個PHP擴(kuò)展去做一個很重的PHP框架。還有一個要提的,什么樣的情況下我們應(yīng)該使用擴(kuò)展,還有一個問題擴(kuò)展為什么會快,這兩個問題,有些看似很簡單問題,其實(shí)要想起來還是挺難的。第一什么樣的情況下我們可以使用擴(kuò)展,我們有兩種方式是需要擴(kuò)展,第一種方式我們有一些,比方說已經(jīng)成熟的C庫,我們PHP許多辦法直接用,我必須用一個擴(kuò)展把它橋接過來,這種情況下需要使用PHP擴(kuò)展。

          還有一種情況我對CPU密集型的東西,比方說我有一個算法,或者我有一個很復(fù)雜,很復(fù)雜的加密算法。這個算法如果我用PHP寫的話非常慢,對于這種CPU密集型的東西,我是可以把它擴(kuò)展化用C來實(shí)現(xiàn),這樣的話能提高性能,就這兩種方式要去使用PHP擴(kuò)展。PHP擴(kuò)展為什么會快呢?這里我要提一下FaceBook極致,去年11月份極致把一個應(yīng)用性能提高到4倍,他是怎么做到的呢?我們大家聽各種各樣報告,是把PHP編譯成C++,他這個編譯其實(shí)不是說我根據(jù)你的邏輯找到對應(yīng)的C代碼進(jìn)行編輯,他做的更多是把這個符號解析給拿掉了。我們在PHP里面,我們的變量,我們的函數(shù)都是存儲在一個一個關(guān)聯(lián)數(shù)字結(jié)構(gòu)里面,他這個結(jié)構(gòu)設(shè)計足夠精妙,確實(shí)也花很大心思去設(shè)計,但是當(dāng)我們使用一個變量,或者一個方式的時候,都需要從這個表里面去查的,這個過程是非常耗時的。

             所以,PHP性能絕大部分低也是這個關(guān)鍵。PHP就把能在編譯期間確定的符號就把它直接替換掉,相當(dāng)于我們C程序編譯的時候把符號直接換成二進(jìn)制地址的一樣,就是一個符號回天。這只是一方面,還有一方面為什么擴(kuò)展會比PHP快?這個我們拋開一切問題,一切IO,拋開一切內(nèi)存存儲我們來算一個簡單算術(shù)題,一個1G赫茲CPU能編織多少,這也是PHP比較慢一個原因。

             比方說一個簡單ICOU(音譯),如果你用C代碼來寫,直接寫ICOU2也可以,如果PHPICOU2先編譯,第二部分先分析這個PHP,找到對應(yīng)PHP調(diào)用,這個時候有三種情況,這時候拿到一個指令進(jìn)行執(zhí)行,當(dāng)執(zhí)行這次指令的時候可能會發(fā)生多次調(diào)用。我一個簡單的ICOU可能在PHP最后執(zhí)行的時候,可能有5次以上函數(shù)調(diào)用,這個就慢了,擴(kuò)展化就可以避免這些問題。

             我們Ap就是一個全功能MVC框架,是用擴(kuò)展來實(shí)現(xiàn),也就是利用C語言去寫的一個PHP擴(kuò)展。這個地方又有一個問題,我們擴(kuò)展一般也兩種理由去寫擴(kuò)展,擴(kuò)展還分兩類,第一類就是說一個簡單我的業(yè)務(wù)邏輯都是用C代碼去做的,我只是簡單從PHP腳本拿到數(shù)據(jù),把處理結(jié)果反給PHP,我基本上不怎么使用Ap。第二個擴(kuò)展就是負(fù)載PHP擴(kuò)展,就是Ap,用了大量API,提供相應(yīng)存量,或者是一些資源給PHP腳本讓用戶去進(jìn)行使用。對于用戶來看,他可能覺得這跟PHP腳本使用起來一樣,他用Ap框架,如果我用PHP腳本使用一個類似框架,把這個替代掉,PHP寫的這個框架換上去對他是透明的。第二類框架復(fù)雜性要遠(yuǎn)遠(yuǎn)高于第一類型,他要遵循PHP引用技術(shù),要遵循PHP一些比較特殊約定。

             當(dāng)然,這些不是說PHP的問題,可能有一些歷史原因。種種這些你都是要去遵循的,這個復(fù)雜度確實(shí)比第一種高一些。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多