norepad++如何編寫php代碼神秘的PHP項(xiàng)目終于揭開面紗,加速和優(yōu)化PHP擴(kuò)展手把手編寫自己的php mvc
2022-02-05
神秘的 PHP 項(xiàng)目終于揭開了面紗。該項(xiàng)目由 PHP 到 C++ 轉(zhuǎn)換器、重新實(shí)現(xiàn)的 PHP 運(yùn)行時(shí)以及許多流行的 PHP 擴(kuò)展的重寫版本組成,旨在加速和優(yōu)化 PHP。
用項(xiàng)目負(fù)責(zé)人趙海平的話說(shuō),項(xiàng)目影響巨大。它目前支持 % 的網(wǎng)絡(luò)流量。這樣一來(lái),服務(wù)器上的 CPU 使用率平均降低了 50%,大大降低了對(duì)服務(wù)器的需求。為了讓這項(xiàng)改進(jìn)也造福于社區(qū),他們決定將其開源,希望進(jìn)一步幫助提高更多大型和復(fù)雜 PHP 網(wǎng)站的可擴(kuò)展性。
PHP 的問(wèn)題和
眾所周知,的前端主要是用PHP編寫的。趙海平說(shuō),過(guò)去的六年,從 PHP 語(yǔ)言的進(jìn)步中受益匪淺。PHP 非常簡(jiǎn)單,易于學(xué)習(xí)和使用,易于閱讀和調(diào)試,因此新工程師快速成長(zhǎng),這有利于促進(jìn)更快的創(chuàng)新。
PHP 是一種腳本語(yǔ)言,其優(yōu)點(diǎn)是編程效率高,并且能夠支持產(chǎn)品的快速迭代。但是相對(duì)于傳統(tǒng)的編譯語(yǔ)言norepad++如何編寫php代碼,腳本語(yǔ)言在 CPU 和內(nèi)存的使用上效率并不高。隨著Ajax技術(shù)的廣泛采用和SNS的高動(dòng)態(tài)要求,這些缺點(diǎn)更加突出。對(duì)于每月超過(guò) 4000 億個(gè) PV,擴(kuò)展尤其具有挑戰(zhàn)性。
一種常見(jiàn)的方法是直接使用 C++ 將 PHP 應(yīng)用程序中更復(fù)雜的部分重寫為 PHP 擴(kuò)展。實(shí)際上,PHP 被轉(zhuǎn)換為連接前端 HTML 和 C++ 應(yīng)用程序邏輯的膠水語(yǔ)言。從技術(shù)角度來(lái)看,這很好,但隨著技能要求的提高,能夠處理整個(gè)應(yīng)用程序的工程師數(shù)量大大減少。學(xué)習(xí) C++ 只是編寫 PHP 擴(kuò)展的第一步網(wǎng)站模板,理解是下一步。由于工程團(tuán)隊(duì)規(guī)模小,每位工程師需要支持超過(guò) 100 萬(wàn)用戶。有些代碼不是團(tuán)隊(duì)中的每個(gè)人都理解的,這是不可接受的。
網(wǎng)站本身的可擴(kuò)展性更具挑戰(zhàn)性,因?yàn)閹缀趺總€(gè)頁(yè)面視圖都是由具有個(gè)性化體驗(yàn)的登錄用戶發(fā)起的。瀏覽首頁(yè)時(shí),系統(tǒng)需要查找你所有的朋友,他們最重要的狀態(tài)更新,根據(jù)隱私設(shè)置過(guò)濾結(jié)果,然后顯示評(píng)論、照片等,這一切都在一秒鐘內(nèi)完成。
自 2007 年以來(lái),已經(jīng)針對(duì)這些問(wèn)題編寫了幾種不同的方法。這包括用另一種語(yǔ)言重寫,但由于開發(fā)的復(fù)雜性和速度等原因,它沒(méi)有實(shí)施。他們還重寫了 PHP 的核心部分 Zend 引擎,并提交給 PHP 項(xiàng)目,但最終沒(méi)有得到他們需要的性能。最終,他們選擇了,最終得到了他們想要的。
有了它,工程師可以用 PHP 編寫代碼、編寫邏輯以組裝最終頁(yè)面,并繼續(xù)快速迭代,而后端服務(wù)則用 C++、Java 編寫,提供新聞提要、搜索、聊天和其他核心功能。
發(fā)展故事
趙海平透露,這個(gè)項(xiàng)目最初來(lái)源于幾年前公司的一次活動(dòng)(員工一晚上自由發(fā)揮,嘗試新想法)。他手動(dòng)將 PHP 轉(zhuǎn)換為 C++ 代碼。盡管語(yǔ)法非常相似,無(wú)論是 CPU 還是內(nèi)存使用norepad++如何編寫php代碼,轉(zhuǎn)換后的 C++ 代碼都明顯優(yōu)于 PHP。所以他想網(wǎng)站優(yōu)化,如果你建立一個(gè)系統(tǒng)并對(duì)轉(zhuǎn)換進(jìn)行編程呢?
在那之前,已經(jīng)有很多方法可以提高 PHP 的性能。Zend 引擎在運(yùn)行時(shí)將 PHP 源代碼轉(zhuǎn)換為在 Zend 虛擬機(jī)上運(yùn)行。大多數(shù) PHP 網(wǎng)站使用的開源項(xiàng)目 APC 和輸出緩存。此外,還有像這樣的商業(yè)產(chǎn)品通過(guò)優(yōu)化和緩存來(lái)提高 PHP 速度。趙海平選擇了另外一條路,直接把PHP轉(zhuǎn)成C++,再轉(zhuǎn)成本地機(jī)器碼。當(dāng)然,同樣的方式還有很多開源項(xiàng)目,phc編譯成C,編譯成Java,編譯成.NET。
接下來(lái)的8個(gè)月,趙海平拿出了原型,足以說(shuō)明這條路是可以走的,而且編譯出來(lái)的代碼確實(shí)更快。很快,加入進(jìn)來(lái)。接下來(lái)是另外 10 個(gè)月的開發(fā)和 6 個(gè)月的生產(chǎn)服務(wù)器測(cè)試。然后它正式啟動(dòng)和部署。6 個(gè)月后,超過(guò) % 的網(wǎng)絡(luò)流量被使用。
據(jù)趙海平介紹,正因?yàn)槿绱?,服?wù)器上的CPU使用率平均降低了50%,從而大大降低了對(duì)服務(wù)器的需求。該項(xiàng)目影響巨大。為了讓這項(xiàng)改進(jìn)也造福于社區(qū),他們決定將其開源,希望進(jìn)一步幫助提高更多大型和復(fù)雜 PHP 網(wǎng)站的可擴(kuò)展性。
原則
將 PHP 代碼轉(zhuǎn)換為高度優(yōu)化的 C++ 代碼,然后使用 g++ 編譯器進(jìn)行編譯。它可以在保持語(yǔ)義等價(jià)的同時(shí)執(zhí)行源代碼,但為了性能犧牲了一些很少使用的特性,例如 eval()。
轉(zhuǎn)換過(guò)程是一個(gè)三步過(guò)程:
· 靜態(tài)分析。收集諸如聲明性關(guān)系和依賴關(guān)系之類的信息。
·類型扣除。選擇最合適的類型,它是 C++ 標(biāo)量嗎?或者,,,或者。
· 代碼生成。大多數(shù) PHP 語(yǔ)句和表達(dá)式直接對(duì)應(yīng)于 C++ 語(yǔ)句和表達(dá)式。
在開發(fā)過(guò)程中,還有一個(gè)副產(chǎn)品: ,一個(gè)實(shí)驗(yàn)性的解釋器。有了它,你可以在不編譯 PHP 源代碼的情況下運(yùn)行它。它已在自己的調(diào)試中使用。
在保持PHP優(yōu)勢(shì)的同時(shí),也具備C++的性能優(yōu)勢(shì)。該項(xiàng)目總共有 300,000 行代碼和 5,000 多個(gè)單元測(cè)試。所有將在 PHP 開源許可下發(fā)布。