<h2>先了解一下什么是fastCGI</h2>
Php是一門(mén)后端腳本語(yǔ)言,與go語(yǔ)言不同,其自身不提供web功能,要實(shí)現(xiàn)web應(yīng)用,需要借助web服務(wù)器。由此引出cgi的概念
先看看什么是cgi(Common Gateway Interface)
早期的web服務(wù)器只處理html等靜態(tài)文件,但像php等動(dòng)態(tài)語(yǔ)言出現(xiàn)后,webserver處理不了了,就交給php解析器處理。但php解釋器如何與web服務(wù)器通信呢?Cgi協(xié)議的出現(xiàn),就是為了解決不同語(yǔ)言解釋器(如php,python)與web服務(wù)器的通信。
簡(jiǎn)單的說(shuō),cgi是用來(lái)和web服務(wù)器打交道的,web服務(wù)器收到用戶(hù)請(qǐng)求,就會(huì)把請(qǐng)求提交給cgi程序,cgi程序(php-fpm,hhvm)根據(jù)請(qǐng)求提交的參數(shù)作相應(yīng)處理(解析php),然后將輸出返回給web服務(wù)器,再返回給客戶(hù)端。
cgi的改進(jìn)->fastcgi:
cgi有個(gè)弊端,每次web請(qǐng)求,都會(huì)重新fork一個(gè)cgi進(jìn)程,結(jié)束再kill掉,資源消耗大,不適合高并發(fā)。
于是fastcig就應(yīng)運(yùn)而生了。它事先早已啟動(dòng)好,一直運(yùn)行等待web請(qǐng)求過(guò)來(lái),再交給php解析,并將結(jié)果返回web服務(wù)器,繼續(xù)等待下一個(gè)請(qǐng)求。
什么是HHVM、php-fpm
php-fpm和hhvm都是fastCGI協(xié)議的一種實(shí)現(xiàn)
Php-fpm:
php-Fastcgi Process Manage,是php的fastCGI實(shí)現(xiàn),并提供了進(jìn)程管理的功能。進(jìn)程包含 master 進(jìn)程和 worker 進(jìn)程兩種進(jìn)程。master 進(jìn)程只有一個(gè),負(fù)責(zé)監(jiān)聽(tīng)端口,接收來(lái)自 Web Server 的請(qǐng)求,而 worker 進(jìn)程則一般有多個(gè)(具體數(shù)量根據(jù)實(shí)際需要配置),每個(gè)進(jìn)程內(nèi)部都嵌入了一個(gè) PHP 解釋器,是 PHP 代碼真正執(zhí)行的地方。
HHVM:
是Facebook開(kāi)源的PHP執(zhí)行引擎,可支持cli,fastcgi server(相當(dāng)于php-fpm),http server(相當(dāng)于nginx+phpfpm)三種運(yùn)行方式。它將php轉(zhuǎn)換為c++,再編譯為二進(jìn)制文件運(yùn)行,所以性能更好。
二者的區(qū)別:
相比php5.2,hhvm性能更高,更省cpu,據(jù)說(shuō)能省40%-60%
但php7出來(lái)后,據(jù)說(shuō)可以替代hhvm
介紹一下HHVM
一、 簡(jiǎn)介
- HHVM (HipHop Virtual Machine) 是 Facebook 開(kāi)源的 PHP 執(zhí)行引擎;
- HHVM 采用一種JIT(just-in-time)的編譯機(jī)制實(shí)現(xiàn)了高性能,同時(shí)又保持對(duì) PHP 語(yǔ)法的充分支持;
- 可支持cli, fastcgi server(相當(dāng)于phpfpm),http server(相當(dāng)于nginx+phpfpm)三種運(yùn)行方式;
二、
1.優(yōu)勢(shì):
高性能:從目前已經(jīng)上線(xiàn)的應(yīng)用看,與php5.2相比,普遍節(jié)省cpu
40%~60%。易用的擴(kuò)展API:HHVM擴(kuò)展編寫(xiě)非常方便,同一個(gè)擴(kuò)展,平均代碼量不到zend擴(kuò)展的一半。
-
單進(jìn)程架構(gòu):更方便運(yùn)維,方便共享全局?jǐn)?shù)據(jù)結(jié)構(gòu)(如配置、字典甚至網(wǎng)絡(luò)連接)
注: HHVM生成和執(zhí)行PHP的在中間字節(jié)碼,執(zhí)行時(shí)通過(guò)JIT(Just In Time即時(shí)編譯,軟件優(yōu)化技術(shù),指在運(yùn)行時(shí)才會(huì)去編譯字節(jié)碼為機(jī)器碼)轉(zhuǎn)換為機(jī)器碼執(zhí)行。JIT將大量重復(fù)執(zhí)行的字節(jié)碼在運(yùn)行時(shí)編譯為機(jī)器碼,達(dá)到提高執(zhí)行效率的目的。通常觸發(fā)JIT的條件是代碼或函數(shù)被多次重復(fù)調(diào)用。
image.png 為什么會(huì)有優(yōu)勢(shì)呢:
zend vm 是解釋型虛擬機(jī),hhvm是二進(jìn)制翻譯型虛擬機(jī),那么為什么zend 比hhvm慢呢?
其實(shí)編譯過(guò)程到生成中間碼的階段2種引擎(zend vm、hhvm)性能差距并不大,大家都是一樣的詞法、語(yǔ)法解析和優(yōu)化生成為中間碼,差距是在執(zhí)行引擎的過(guò)程中也就是runtime中:
zend 執(zhí)行引擎中opcode被cache opcode 后,就不需要重新編譯了,然后每次都去調(diào)用c的接口,然后c接口再翻譯為機(jī)器碼執(zhí)行;
hhvm執(zhí)行引擎hhbc(bytecode)生成后也不需要重新翻譯了,如果非JIT模式其實(shí)和zend+cache模式原理是一樣的,通過(guò)opcode出棧調(diào)用c接口,然后再將C翻譯為機(jī)器碼執(zhí)行;而JIT模式首次需要將opcode翻譯為機(jī)器碼并且將其cache住,之后每次則執(zhí)行cache中的機(jī)器碼而不去執(zhí)行C層的代碼,少了一層翻譯過(guò)程,直接執(zhí)行二進(jìn)制代碼了,這樣效率就上去了。

未完結(jié).....持續(xù)進(jìn)行
