Facebook揭祕HipHop項目 PHP程序大提速

編程效率高是PHP語言最大的特色,可是做爲腳本語言,一直存在着CPU和內存使用效率不高的問題,直到HipHop for PHP的出現。Facebook神祕的PHP項目HipHop for PHP終於揭開面紗。這個項目由一個PHP到C++的轉換程序,一個從新實現的PHP運行庫,和許多經常使用PHP擴展的重寫版本構成,目的是旨在加速和優化 PHP。前端

用Facebook官方博客(沒法直接訪問)上項目負責人趙海平(北大1987屆遺傳與分子生物專業,普林斯頓計算機科學博士)的話 說,HipHop項目對Facebook影響巨大。它目前已經支撐了Facebook 90%的Web流量。因爲HipHop,Facebook Web服務器上的CPU使用平均減小了50%,從而大大減小了服務器的需求。爲了讓這一改進也惠及社區,他們決定將之開源,但願可以進一步幫助提升更多大 型複雜PHP網站的可伸縮性。編程

PHP和Facebook的問題後端

衆所周知,Facebook的前端主要是用PHP寫的。趙海平說,過去六年Facebook從PHP語言的進展上獲益良多。PHP很是簡單,易學易用,好讀好調試,所以新工程師成長很快,有利地促進了Facebook的更快的創新。緩存

PHP是一種腳本語言,其好處是編程效率高,可以支持產品的快速迭代。可是與傳統的編譯語言相比,腳本語言的CPU和內存使用效率很差。隨着 Ajax技術的普遍採用,加上SNS對動態要求較高,這些缺點更顯得突出。對於每個月超過4000億次PV的Facebook來講,如何實現擴展,尤爲具備 挑戰性。服務器

常見的辦法是直接用C++重寫PHP應用中比較複雜的部分,做爲PHP擴展。實際上,PHP就轉變爲一種膠水語言,鏈接前端HTML和C++應用邏 輯。從技術角度講這也沒有問題,可是增長了技能需求,可以在整個應用上工做的工程師數量就大大減小了。學習C++只是編寫PHP擴展的第一步,接下來還要 理解Zend API。因爲Facebook的工程團隊較小,每一個工程師要支持100萬以上的用戶。有些代碼不是團隊裏每一個人都能看懂,這對於Facebook是沒法接 受的。函數

Facebook網站自己的可伸縮性更具挑戰性,由於幾乎每次頁面瀏覽都是有個性化體驗的登陸用戶發起。瀏覽主頁 時,系統須要查詢全部朋友、朋友最重要的狀態更新、 根據隱私設置篩選結果,而後還要顯示評論、照片等等動態,這一切都須要在一秒內完成。性能

HipHop for PHP

自2007年以來,Facebook曾寫過幾種不一樣辦法解決這些問題。其中包括用另外一種語言重寫Facebook,可是因爲開發的複雜性和速度等原 因,未能實現。他們還重寫了PHP的核心部分Zend引擎,並提交給了PHP項目,但最終仍是沒有得到所需的性能。最後,他們選擇了HipHop,終於得 償所願。單元測試

有了HipHop,工程師能夠編寫代碼,用PHP編寫組合最後頁面的邏輯,並可以繼續快速迭代,同時後端服務使用C++, Erlang, Java, Py thon編寫,提供新聞提要、搜索、聊天和其餘核心功能。學習

HipHop開發故事測試

趙海平透露,項目最初是來自幾年前Facebook公司一次Hackathon活動(員工在一個晚上自由發揮,實驗新的想法),他手工將PHP轉換 爲C++代碼,雖然語法上很相似,可是不管是CPU仍是內存使用,轉換後的C++代碼都大大優於PHP。因而他想,若是構建一個系統,編程實現轉換,會怎 麼樣呢?

在此以前,已經有了很多改善PHP性能的方法。Zend引擎在運行時轉換PHP源代碼爲運行在Zend虛擬機上的opcode。開源項目APC和 eAccelerator將輸出緩存,爲大多數PHP網站所使用。此外,還有Zend Server這樣的商業產品,經過opcode優化和緩存,提升PHP速度。趙海平選擇了另外一條道路,將PHP直接轉爲C++,而後再變成本地機器碼。當 然,有許多開源項目也是一樣的思路,Roadsend和phc編譯爲C,Quercus編譯爲Java,而Phalanger編譯爲.NET。

Hackathon以後8個月,趙海平拿出了原型,足以說明這條路能夠走通,編譯後的代碼的確更快。不久,Iain Proctor和Minghui Yang加入進來。接下來又開發了10個月,在生產服務器上測試了6個月。而後正式上線部署,6個月以後,Facebook 90%以上的Web流量都使用了HipHop。

按趙海平的說法,憑藉HipHop,Facebook Web服務器上的CPU使用平均減小了50%,從而大大減小了服務器的需求。項目對Facebook影響巨大。爲了讓這一改進也惠及社區,他們決定將之開源,但願可以進一步幫助提升更多大型複雜PHP網站的可伸縮性。

HipHop的原理

HipHop將PHP代碼轉換爲高度優化的C++代碼,而後再用g++編譯器編譯。它能夠保持語義等效地執行源代碼,但爲了提升性能,犧牲了一些不多用到的特性,好比eval()。

HipHop開發中的主要困難在於,在PHP和C++這兩種很不同的語言之間怎麼實現轉換。雖然PHP也能夠寫一些很巧妙的動態特性,可是大多數 PHP代碼仍是很是簡單的。if (...) {...} else {..} 比foo($x) { include $x; } 確定更常見。這爲性能提升提供了機會。HipHop生成的代碼儘量地使用函數和變量的靜態綁定。同時,還使用類型推演來選出變量最可能對應的某個類型, 從而節省內存。轉換過程分三步:

1. 靜態分析。收集聲明關係和依賴關係等信息。

2. 類型推演。選擇最合適的類型,是C++的標量?仍是String, Array, classes, Object或者Variant。

3. 代碼生成。大部分直接將PHP語句和表達式對應爲C++的語句和表達式。

在開發過程當中,還有一個副產品:HPHPi,是一個實驗性的解釋器。經過它,不編譯PHP源代碼也能夠運行。它已經用於HipHop自身的調試中。 HipHop在保持了PHP優勢的同時,也兼得了C++的性能優點。項目總共有30萬行代碼,5000多個單元測試。全部這些都將以PHP開源許可證形式 發佈到GitHub。

相關文章
相關標籤/搜索