成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何讓PHP性能問題不再飽受詬病

warnerwu / 892人閱讀

摘要:作為開發(fā)中應(yīng)用最廣泛的開源腳本語言,憑借庫類豐富,使用簡單,安全等特點(diǎn),成為和等互聯(lián)網(wǎng)巨頭和全球超過網(wǎng)站的主要開發(fā)語言,然而性能問題是一直以來飽受詬病的,來自開發(fā)組的高馳濤同學(xué)將為我們帶來他對性能優(yōu)化方面的思考和建議。

PHP作為Web開發(fā)中應(yīng)用最廣泛的開源腳本語言,憑借庫類豐富,使用簡單,安全等特點(diǎn),成為Facebook和BAT等互聯(lián)網(wǎng)巨頭和全球超過70%網(wǎng)站的主要開發(fā)語言,然而性能問題是PHP一直以來飽受詬病的,來自PHP/PECL開發(fā)組的高馳濤同學(xué)將為我們帶來他對PHP性能優(yōu)化方面的思考和建議。

本期主講:高馳濤,Neeke Gao,PHP/PECL開發(fā)組成員,同時是SeasLog,JsonNet-PHP的作者,目前在云智慧擔(dān)任架構(gòu)師。
今天主要從PHP的發(fā)展和性能優(yōu)化歷史,來談PHP語言在性能優(yōu)化方面所做過的努力,以及我們的一些研究成果。
談起PHP,我們先來了解幾個數(shù)字:

1995年, PHP發(fā)布了第一個版本,這要感謝PHP之父Rasmus Lerdorf的辛苦努力。PHP在問世之初是Personal Home Page的縮寫,那時候只是被當(dāng)作制作個人網(wǎng)頁的一門簡單語言;后來隨著互聯(lián)網(wǎng)的發(fā)展以及開源社區(qū)的貢獻(xiàn),PHP逐步成長成為一門被廣泛應(yīng)用的高級語言,其英文含義也進(jìn)化為PHP: Hypertext Preprocessor,即超級文本預(yù)處理語言。

官方統(tǒng)計(jì)數(shù)字顯示,全球排名前1000萬的網(wǎng)站應(yīng)用中,有81.9%是使用PHP語言開發(fā)的。而且,每天有416個新增PHP網(wǎng)站進(jìn)入全球前1000萬排名,數(shù)量還在不斷增加。發(fā)展到今天,PHP經(jīng)歷了4,5,7幾個非常重大的版本迭代,最新的release版本是7.0.6。在二十多年的發(fā)展過程中,應(yīng)用最廣泛的PHP版本是PHP 5,同時也是目前全球互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一個語言版本。

為什么沒有PHP6,而是直接從PHP5到PHP7,這里面有一個小故事。目前的PHP5.6,其實(shí)就是原預(yù)計(jì)發(fā)布的PHP6,但由于各項(xiàng)改動不足以支撐一個全新的PHP分支,組織內(nèi)投票沒有通過發(fā)布,而最終作為了PHP5.6進(jìn)行發(fā)布。

PHP7又稱為PHP NG,即“PHP Next Generation(下一代PHP)”,在性能和穩(wěn)定性方面做了非常大的提升。為什么這么說呢,要從PHP的業(yè)務(wù)模型說起。

1、PHP Transaction Module業(yè)務(wù)模型
下面我先帶大家過一下PHP5幾個重大版本改動中的性能優(yōu)化點(diǎn),下面這張圖是PHP整個運(yùn)行過程中的幾個關(guān)鍵點(diǎn)。

在PHP運(yùn)行過程中,在Script Entry接收到請求之后。
首先經(jīng)過語法解析器(Parser),此時會拋出一些致命的語法錯誤或警告(后續(xù)的版本改動中,會有一些致命錯誤轉(zhuǎn)換為exception拋出);
其次經(jīng)過編譯器(Compiler),這部分內(nèi)容中會進(jìn)行更高級的解析,并測試將PHP高級語言編譯成OpCode;

然后交給Execute進(jìn)行執(zhí)行;執(zhí)行過程中發(fā)現(xiàn)有新的文件或類被引入,會再進(jìn)行Compiler,往復(fù)執(zhí)行。

從這里可以看出,其實(shí)PHP也是“編譯型”語言,只不過是每次請求都編譯,或稱動態(tài)編譯。那么,后續(xù)的優(yōu)化過程中就可以進(jìn)行針對性優(yōu)化,即:將編譯后的內(nèi)容緩存起來,直接執(zhí)行,以節(jié)省編譯時間。

了解一點(diǎn)PHP的同學(xué)都知道,PHP通常被認(rèn)為是簡單、低效,這并不是沒有道理。我們來看一段PHP源碼,從而向大家解釋為什么“簡單”,為什么“低效”。

這段結(jié)構(gòu)是PHP5及以前版本中所有變量和方法執(zhí)行的核心,這是通用的變量存儲結(jié)構(gòu)??梢钥吹剑粋€變量能夠同時有多個屬性,或long,或double,或char,或int,或array,或Object。這給工程師以充分的自由度,同樣的一個數(shù)字,或字符串,不需要預(yù)設(shè)類型,就可以直接生成并使用。這就是為什么“簡單”,這是對工程師來說的。

而同時丟給Zend引擎(解析執(zhí)行引擎)的,有著大量的負(fù)擔(dān),因?yàn)樾枰嬖诿恳淮问褂没蜻\(yùn)算時,都要不停的判斷類型究竟是什么類型屬性。這就是為什么“低效”的一個最直接原因。

2、PHP Performance Difficulty 性能之坑
對于一個使用PHP開發(fā)的應(yīng)用來說,經(jīng)過大量的實(shí)踐,可以總結(jié)出4個最影響性能的點(diǎn):

IO, Memory, CPU, NetWork,是不是非常眼熟?沒錯,這其實(shí)并不單單是PHP語言的性能瓶頸,任何一門語言,或者就目前我們所處的世界中,凡是使用計(jì)算機(jī)語言開發(fā)的服務(wù)或應(yīng)用,都存在這4個瓶頸。

3、Optimize from PHP5 to PHP7 優(yōu)化之旅
下面就為大家介紹一下PHP5圍繞以上4個點(diǎn)所做的一些性能優(yōu)化。在聊具體的性能優(yōu)化方法之前,我們可以拋開之前的知識儲備,打開腦洞,發(fā)散思維,思考應(yīng)該如何入手。每個人的想法完全不一樣,我的想法是這樣的:

?會不會是PHP本身的運(yùn)行模型(或業(yè)務(wù)模型)或者Zend引擎設(shè)計(jì)存在問題?
?有沒有可能將PHP語言在發(fā)布運(yùn)行之前進(jìn)行預(yù)編譯,把它轉(zhuǎn)變成Bytecode?
?有沒有可能通過一種解析器把PHP轉(zhuǎn)變成C或C++語言,然后進(jìn)行make或build?
?能不能開發(fā)另一套解析運(yùn)行引擎?
?會不會出現(xiàn)另一套完全不一樣的運(yùn)行模型(或業(yè)務(wù)模型)?
?等等。

這些想法在PHP社區(qū)內(nèi)屢見不鮮,并不僅僅是我一個人在這么想,非常多PHP資深專家也在思考,而且在各個方向上都有一些開源的工具或服務(wù)發(fā)布了。由于PHP5有非常多版本,這里我們僅就應(yīng)用最廣的PHP5.4和PHP5.5-5.6版本來簡要說明性能優(yōu)化的幾個點(diǎn)。

PHP5.4 最主要的性能改進(jìn)是在數(shù)組的生成和應(yīng)用上面,一個簡單的延后分配節(jié)省了非常大量的內(nèi)存,因?yàn)槎鄶?shù)情況數(shù)組在直接引用上并不進(jìn)行運(yùn)算,從而并不進(jìn)行內(nèi)存建立與分配工作。另外,PHP5.4在運(yùn)行時中添加了Literal Table和Binding Cache操作,這兩個改動相對上面延后分配內(nèi)存是更復(fù)雜一些的,它在運(yùn)行過程中節(jié)省了大量的CPU運(yùn)算。

PHP5.5及5.6放在一起來說,因?yàn)樗鼈冋娴暮芟?,而且在目前PHP5整個大分支的維護(hù)過程中,一般是在PHP5.5上進(jìn)行,然后把相關(guān)修改向5.6同步。5.5和5.6最重要的一個性能改進(jìn),是使用了編譯Cache。前面我們了解了PHP的運(yùn)行過程中會存在“編譯->OpCode->執(zhí)行”的過程,而將編譯結(jié)果緩存起來是一個重要的性能優(yōu)化點(diǎn),OpCache就是做這個工作的。OpCache從此進(jìn)入了PHP的內(nèi)核,而不再是一個第三方擴(kuò)展。

同時Zend引擎還有同樣一個Cache優(yōu)化擴(kuò)展版本產(chǎn)生,即Zend O+,可以認(rèn)為是Zend的Plus版本,在內(nèi)存和CPU上,都做了一些改進(jìn)。

最后來看看PHP7的幾個優(yōu)化點(diǎn):PHP7直接修改了Zend Zval結(jié)構(gòu),這算得上是一個很大改動。同時在PHP7中,數(shù)組的結(jié)構(gòu)也變得更加的不一樣,這又是一個傷筋動骨的改動。官方數(shù)據(jù)中PHP7較PHP5.6有近兩倍的性能提升,主要就集中在這兩個點(diǎn)上。
看一下PHP源碼:

在一個Zval結(jié)構(gòu)中,一個變量仍然可以屬于各種類型的,但在使用的時候,可以快速判斷是哪種類型,因?yàn)椴煌念愋蜁鎯υ诓煌闹羔樦?;而且?nèi)存使用也由于不同的指針類型而大量地降低;由于內(nèi)存使用大量降低,從而為CPU更快地尋址和操作帶來了更好的可能性。所以有了Zval的結(jié)構(gòu)變動帶來35%性能提升的結(jié)論。

同一個數(shù)組,在PHP5中的內(nèi)存使用是跳躍不連貫的,而在PHP7中是連續(xù)有序的,這使得內(nèi)存使用和CPU使用都更加地高效,數(shù)組的結(jié)構(gòu)變動,給PHP7帶來了接近50%的性能提升。
4、PHP Performance Tools 工具推薦

前面在我們發(fā)散思維時列舉了很多PHP性能優(yōu)化的點(diǎn),幾個開源社區(qū)中已經(jīng)發(fā)布過針對這些的優(yōu)化工具,給大家推薦一些:
Facebook發(fā)布的HHVM:

HHVM (HipHop Virtual Machine)類似于C#的CLR和Java的JVM,會將PHP代碼轉(zhuǎn)換成高級別的字節(jié)碼(通常稱為中間語言),然后在運(yùn)行時通過即時(JIT)編譯器將這些字節(jié)碼轉(zhuǎn)換為x64的機(jī)器碼。
下面是一些在開發(fā)調(diào)試過程中經(jīng)常使用的工具和軟件服務(wù):


此類開發(fā)工具和服務(wù)很多,可以為開發(fā)者和運(yùn)維同學(xué)節(jié)省大量的定位和解決問題時間。
以我開發(fā)的SeasLog為例,由于使用內(nèi)存buffer/批量IO,替代直接IO,可以直接為服務(wù)的QPS能力提升帶來強(qiáng)勁動力,下圖是SeasLog和log4php的性能對比:

最后為東家打個小廣告,云智慧的APM應(yīng)用性能管理產(chǎn)品透視寶www.toushibao.com,可以提供更為強(qiáng)勁的性能管理分析的商業(yè)支持方案,目前支持包括PHP,Java,DotNet,Python,IOS,Android在內(nèi)各種主流應(yīng)用的性能監(jiān)測和管理分析能力,歡迎大家交流體驗(yàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21703.html

相關(guān)文章

  • 小程序跨平臺開發(fā)解決方案探索

    摘要:繼微信正式推出微信小程序后,各個大廠陸續(xù)發(fā)布了各自的小程序平臺支付寶小程序百度小程序頭條小程序,跨小程序平臺開發(fā)也成為了眾多小程序開發(fā)者要面臨的問題。 繼微信正式推出微信小程序后,各個大廠陸續(xù)發(fā)布了各自的小程序平臺 —— 支付寶小程序、百度小程序、頭條小程序,跨小程序平臺開發(fā)也成為了眾多小程序開發(fā)者要面臨的問題。 Antmove - 小程序跨平臺解決方案 小程序開發(fā)血淚史 小程序發(fā)展初...

    xiangzhihong 評論0 收藏0
  • 云計(jì)算發(fā)展備受矚目的五大方向

    摘要:云計(jì)算發(fā)展備受矚目的五大方向云計(jì)算帶來了前所未有的工作方式,也改變了傳統(tǒng)軟件工程企業(yè)。云端安全仍不容忽視云計(jì)算自備受關(guān)注之日起其安全性就飽受詬病,這個永恒的話題,一直高燒不退?! ∽?006年3月亞馬遜(Amazon)推出彈性計(jì)算云服務(wù)起,云計(jì)算就引起了業(yè)內(nèi)外人士廣泛關(guān)注。在這將近八年的時間里,其作為一個新的技術(shù)趨勢已經(jīng)得到了快速的發(fā)展。2015年,互聯(lián)網(wǎng)、金融、制造、物流等行業(yè)內(nèi)企業(yè)根據(jù)自...

    liuchengxu 評論0 收藏0
  • 微博什么技術(shù)啊……還說支持八個明星并發(fā)出軌,結(jié)果…

    摘要:然而,悲傷的是,她已不再是國民媳婦了事后,于是網(wǎng)絡(luò)上就有人報怨微博的技術(shù)能力了,還說同時支持八個,一個明星結(jié)婚就頂不住了。關(guān)于微博能同時支持八個明星并發(fā)出軌,現(xiàn)在都成了一個埂,成就了一個個段子在博主朋友圈刷屏。。 showImg(https://segmentfault.com/img/remote/1460000016709618?w=870&h=601); 是的,大家可能都知道了,...

    LeoHsiun 評論0 收藏0
  • 云計(jì)算正在打開局面 未來發(fā)展遵從這幾大方向

    摘要:云計(jì)算在消費(fèi)領(lǐng)域的普及應(yīng)用,極大地改變了人類的生活方式。云端安全仍不容忽視云計(jì)算自備受關(guān)注之日起其安全性就飽受詬病,這個永恒的話題,一直高燒不退。  云計(jì)算最早是由谷歌提出來的概念,其核心是將IT基礎(chǔ)設(shè)施互聯(lián)網(wǎng)化,而將云計(jì)算更好地規(guī)?;a(chǎn)業(yè)化的則是亞馬遜。從云計(jì)算概念的提出,到云計(jì)算的發(fā)展與落成。這位云姑娘(云計(jì)算),從翩然而至我們生活,到如今毅然融入我們生活,成就了我們當(dāng)今科技社會發(fā)展中...

    hsluoyz 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<