PHP轉(zhuǎn)換器 HipHop for PHP
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
HipHop for PHP 在技術(shù)上并不是一個 PHP 的編譯器,它用來將 PHP 源碼轉(zhuǎn)成高度優(yōu)化的 C++ 代碼并使用 g++ 進(jìn)行編譯,這是 Facebook 公司推出的。轉(zhuǎn)換過程如下圖所示: Facebook神秘的PHP項目HipHop for PHP終于揭開面紗。這個項目由一個PHP到C++的轉(zhuǎn)換程序,一個重新實現(xiàn)的PHP運行庫,和許多常用PHP擴(kuò)展的重寫版本構(gòu)成,目的是旨在加速和優(yōu)化PHP。 用Facebook官方博客(無法直接訪問)上項目負(fù)責(zé)人趙海平(北大1987屆遺傳與分子生物專業(yè),普林斯頓計算機(jī)科學(xué)博士)的話說,HipHop項目對Facebook影響巨大。它目前已經(jīng)支撐了Facebook 90%的Web流量。由于HipHop,F(xiàn)acebook Web服務(wù)器上的CPU使用平均減少了50%,從而大大減少了服務(wù)器的需求。為了讓這一改進(jìn)也惠及社區(qū),他們決定將之開源,希望能夠進(jìn)一步幫助提高更多大型復(fù)雜PHP網(wǎng)站的可伸縮性。
PHP和Facebook的問題眾所周知,F(xiàn)acebook的前端主要是用PHP寫的。趙海平說,過去六年Facebook從PHP語言的進(jìn)展上獲益良多。PHP非常簡單,易學(xué)易用,好讀好調(diào)試,因此新工程師成長很快,有利地促進(jìn)了Facebook的更快的創(chuàng)新。 PHP是一種腳本語言,其好處是編程效率高,能夠支持產(chǎn)品的快速迭代。但是與傳統(tǒng)的編譯語言相比,腳本語言的CPU和內(nèi)存使用效率不好。隨著Ajax技術(shù)的廣泛采用,加上SNS對動態(tài)要求較高,這些缺點更顯得突出。對于每月超過4000億次PV的Facebook來說,如何實現(xiàn)擴(kuò)展,尤其具有挑戰(zhàn)性。 常見的辦法是直接用C++重寫PHP應(yīng)用中比較復(fù)雜的部分,作為PHP擴(kuò)展。實際上,PHP就轉(zhuǎn)變?yōu)橐环N膠水語言,連接前端HTML和C++應(yīng)用邏輯。從技術(shù)角度講這也沒有問題,但是增加了技能需求,能夠在整個應(yīng)用上工作的工程師數(shù)量就大大減少了。學(xué)習(xí)C++只是編寫PHP擴(kuò)展的第一步,接下來還要理解Zend API。由于Facebook的工程團(tuán)隊較小,每個工程師要支持100萬以上的用戶。有些代碼不是團(tuán)隊里每個人都能看懂,這對于Facebook是無法接受的。 Facebook網(wǎng)站本身的可伸縮性更具挑戰(zhàn)性,因為幾乎每次頁面瀏覽都是有個性化體驗的登錄用戶發(fā)起。瀏覽主頁 時,系統(tǒng)需要查詢所有朋友、朋友最重要的狀態(tài)更新、 根據(jù)隱私設(shè)置篩選結(jié)果,然后還要顯示評論、照片等等動態(tài),這一切都需要在一秒內(nèi)完 成。 自2007年以來,F(xiàn)acebook曾寫過幾種不同辦法解決這些問題。其中包括用另 一種語言重寫Facebook,但是由于開發(fā)的復(fù)雜性和速度等原因,未能實現(xiàn)。他們還重寫了PHP的核心部分Zend引擎,并提交給了PHP項目,但最終還是沒有獲得所需的性能。最后,他們選擇了HipHop,終于得償所愿。 有了HipHop,工程師可以編寫代碼,用PHP編寫組合最后頁面的邏輯,并能夠繼續(xù)快速迭代,同時后端服務(wù)使用C++, Erlang, Java, Py thon編寫,提供新聞提要、搜索、聊天和其他核心功能。HipHop開發(fā)故事趙海平透露,項目最初是來自幾年前Facebook公司一次Hackathon活動(員工在一個晚上自由發(fā)揮,實驗新的想法),他手工將PHP轉(zhuǎn)換為C++代碼,雖然語法上很類似,但是無論是CPU還是內(nèi)存使用,轉(zhuǎn)換后的C++代碼都大大優(yōu)于PHP。于是他想,如果構(gòu)建一個系統(tǒng),編程實現(xiàn)轉(zhuǎn)換,會怎么樣呢? 在此之前,已經(jīng)有了不少改善PHP性能的方法。Zend引擎在運行時轉(zhuǎn)換PHP源代碼為運行在Zend虛擬機(jī)上的opcode。開源項目APC和eAccelerator將輸出緩存,為大多數(shù)PHP網(wǎng)站所使用。此外,還有Zend Server這樣的商業(yè)產(chǎn)品,通過opcode優(yōu)化和緩存,提高PHP速度。趙海平選擇了另一條道路,將PHP直接轉(zhuǎn)為C++,然后再變成本地機(jī)器碼。當(dāng)然,有許多開源項目也是同樣的思路,Roadsend和phc編譯為C,Quercus編譯為Java,而Phalanger編譯為.NET。 Hackathon之后8個月,趙海平拿出了原型,足以說明這條路可以走通,編譯后的代碼的確更快。不久,Iain Proctor和Minghui Yang加入進(jìn)來。接下來又開發(fā)了10個月,在生產(chǎn)服務(wù)器上測試了6個月。然后正式上線部署,6個月之后,F(xiàn)acebook 90%以上的Web流量都使用了HipHop。 按趙海平的說法,憑借HipHop,F(xiàn)acebook Web服務(wù)器上的CPU使用平均減少了50%,從而大大減少了服務(wù)器的需求。項目對Facebook影響巨大。為了讓這一改進(jìn)也惠及社區(qū),他們決定將之開源,希望能夠進(jìn)一步幫助提高更多大型復(fù)雜PHP網(wǎng)站的可伸縮性。HipHop的原理HipHop將PHP代碼轉(zhuǎn)換為高度優(yōu)化的C++代碼,然后再用g++編譯器編譯。它可以保持語義等效地執(zhí)行源代碼,但為了提高性能,犧牲了一些很少用到的特性,比如eval()。 HipHop開發(fā)中的主要困難在于,在PHP和C++這兩種很不一樣的語言之間怎么實現(xiàn)轉(zhuǎn)換。雖然PHP也可以寫一些很巧妙的動態(tài)特性,但是大多數(shù)PHP代碼還是非常簡單的。if (...) {...} else {..} 比foo($x) { include $x; } 肯定更常見。這為性能提高提供了機(jī)會。HipHop生成的代碼盡可能地使用函數(shù)和變量的靜態(tài)綁定。同時,還使用類型推演來選出變量最可能對應(yīng)的某個類型,從而節(jié)省內(nèi)存。 轉(zhuǎn)換過程分三步: 1. 靜態(tài)分析。收集聲明關(guān)系和依賴關(guān)系等信息。 2. 類型推演。選擇最合適的類型,是C++的標(biāo)量?還是String, Array, classes, Object或者Variant。 3. 代碼生成。大部分直接將PHP語句和表達(dá)式對應(yīng)為C++的語句和表達(dá)式。 在開發(fā)過程中,還有一個副產(chǎn)品:HPHPi,是一個實驗性的解釋器。通過它,不編譯PHP源代碼也可以運行。它已經(jīng)用于HipHop自身的調(diào)試中。 HipHop在保持了PHP優(yōu)點的同時,也兼得了C++的性能優(yōu)勢。項目總共有30萬行代碼,5000多個單元測試。所有這些都將以PHP開源許可證形式發(fā)布到GitHub。該文章在 2012/6/3 0:27:55 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |