PHP-FPM
早期版本的 PHP 并沒(méi)有內(nèi)置的 WEB 服務(wù)器,而是提供了 SAPI(Server API)給第三方做對(duì)接。現(xiàn)在非常流行的 php-fpm 就是通過(guò) FastCGI 協(xié)議來(lái)處理 PHP 與第三方 WEB 服務(wù)器之間的通信。? ? ? ? ? ? ? ? ? ? ? ? ? ?(推薦學(xué)習(xí): swoole視頻教程)
比如 Nginx + php-fpm 的組合,這種方式運(yùn)行的 fpm 是 Master/Worker 模式,啟動(dòng)一個(gè) Master 進(jìn)程監(jiān)聽(tīng)來(lái)自 Nginx 的請(qǐng)求,再 fork 多個(gè) Worker 進(jìn)程處理請(qǐng)求。每個(gè) Worker 進(jìn)程只能處理一個(gè)請(qǐng)求,單一進(jìn)程的生命周期大體如下:
初始化模塊。
初始化請(qǐng)求。此處請(qǐng)求是請(qǐng)求 PHP 執(zhí)行代碼的意思,并非 HTTP 的請(qǐng)求。
執(zhí)行 PHP 腳本。
結(jié)束請(qǐng)求。
關(guān)閉模塊。
Swoole 采用的也是 Master/Worker 模式,不同的是 Master 進(jìn)程有多個(gè) Reactor 線程,Master 只是一個(gè)事件發(fā)生器,負(fù)責(zé)監(jiān)聽(tīng) Socket 句柄的事件變化。
Worker 以多進(jìn)程的方式運(yùn)行,接收來(lái)自 Reactor 線程的請(qǐng)求,并執(zhí)行回調(diào)函數(shù)(PHP 編寫(xiě)的)。啟動(dòng) Master 進(jìn)程的流程大致是:
初始化模塊。
初始化請(qǐng)求。因?yàn)?swoole 需要通過(guò) cli 的方式運(yùn)行,所以初始化請(qǐng)求時(shí),不會(huì)初始化 PHP 的全局變量,如 $_SERVER, $_POST, $_GET 等。
執(zhí)行 PHP 腳本。包括詞法、語(yǔ)法分析,變量、函數(shù)、類的初始化等,Master 進(jìn)入監(jiān)聽(tīng)狀態(tài),并不會(huì)結(jié)束進(jìn)程。
Swoole 加速的原理
由Reactor(epoll 的 IO 復(fù)用方式)負(fù)責(zé)監(jiān)聽(tīng)Socket句柄的事件變化,解決高并發(fā)問(wèn)題。
通過(guò)內(nèi)存常駐的方式節(jié)省 PHP 代碼初始化的時(shí)間,在使用笨重的框架時(shí),用 swoole 加速效果是非常明顯的。