欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          PHP-FPM與Swoole的比較

          前幾天看見有幾篇講 swoole 的文章,今天我也來湊個(gè)熱鬧。水平有限,細(xì)節(jié)理解可能不到位,歡迎大家?guī)臀已a(bǔ)充、糾正。

          PHP-FPM

          早期版本的 PHP 并沒有內(nèi)置的 WEB 服務(wù)器,而是提供了 SAPI(Server API)給第三方做對(duì)接?,F(xiàn)在非常流行的 php-fpm 就是通過 FastCGI 協(xié)議來處理 PHP 與第三方 WEB 服務(wù)器之間的通信。比如 Nginx + php-fpm 的組合,這種方式運(yùn)行的 fpm 是 Master/Worker 模式,啟動(dòng)一個(gè) Master 進(jìn)程監(jiān)聽來自 Nginx 的請(qǐng)求,再 fork 多個(gè) Worker 進(jìn)程處理請(qǐng)求。每個(gè) Worker 進(jìn)程只能處理一個(gè)請(qǐng)求,單一進(jìn)程的生命周期大體如下:

          1.初始化模塊。

          2.初始化請(qǐng)求。此處請(qǐng)求是請(qǐng)求 PHP 執(zhí)行代碼的意思,并非 HTTP 的請(qǐng)求。

          3.執(zhí)行 PHP 腳本。

          4.結(jié)束請(qǐng)求。

          5.關(guān)閉模塊。

          多進(jìn)程模型是依賴進(jìn)程數(shù)來解決并發(fā)問題,一個(gè)進(jìn)程只能處理一個(gè)連接,當(dāng)啟動(dòng)大量進(jìn)程,進(jìn)程調(diào)度消耗可能占 CPU 的百分之幾十甚至 100%,比如 C10K 問題,多進(jìn)程模型就力不從心了。

          Swoole

          Swoole 采用的也是 Master/Worker 模式,不同的是 Master 進(jìn)程有多個(gè) Reactor 線程,Master 只是一個(gè)事件發(fā)生器,負(fù)責(zé)監(jiān)聽 Socket 句柄的事件變化。Worker 以多進(jìn)程的方式運(yùn)行,接收來自 Reactor 線程的請(qǐng)求,并執(zhí)行回調(diào)函數(shù)(PHP 編寫的)。啟動(dòng) Master 進(jìn)程的流程大致是:

          1.初始化模塊。

          2.初始化請(qǐng)求。因?yàn)?swoole 需要通過 cli 的方式運(yùn)行,所以初始化請(qǐng)求時(shí),不會(huì)初始化 PHP 的全局變量,如 $_SERVER, $_POST, $_GET 等。

          3.執(zhí)行 PHP 腳本。包括詞法、語(yǔ)法分析,變量、函數(shù)、類的初始化等,Master 進(jìn)入監(jiān)聽狀態(tài),并不會(huì)結(jié)束進(jìn)程。

          Swoole 加速的原理

          ● 由 Reactor(epoll 的 IO 復(fù)用方式)負(fù)責(zé)監(jiān)聽 Socket 句柄的事件變化,解決高并發(fā)問題。

          ● 通過內(nèi)存常駐的方式節(jié)省 PHP 代碼初始化的時(shí)間,在使用笨重的框架時(shí),用 swoole 加速效果是非常明顯的。

          對(duì)比不同

          PHP-FPM

          ● Master 主進(jìn)程 / Worker 多進(jìn)程模式。

          ● 啟動(dòng) Master,通過 FastCGI 協(xié)議監(jiān)聽來自 Nginx 傳輸?shù)恼?qǐng)求。

          ● 每個(gè) Worker 進(jìn)程只對(duì)應(yīng)一個(gè)連接,用于執(zhí)行完整的 PHP 代碼。

          ● PHP 代碼執(zhí)行完畢,占用的內(nèi)存會(huì)全部銷毀,下一次請(qǐng)求需要重新再進(jìn)行初始化等各種繁瑣的操作。

          ● 只用于 HTTP Server。

          Swoole

          ● Master 主進(jìn)程(由多個(gè) Reactor 線程組成)/ Worker 多進(jìn)程(或多線程)模式

          ● 啟動(dòng) Master,初始化 PHP 代碼,由 Reactor 監(jiān)聽 Socket 句柄的事件變化。

          ● Reactor 主線程負(fù)責(zé)子多線程的均衡問題,Manager 進(jìn)程管理 Worker 多進(jìn)程,包括 TaskWorker 的進(jìn)程。

          ● 每個(gè) Worker 接受來自 Reactor 的請(qǐng)求,只需要執(zhí)行回調(diào)函數(shù)部分的 PHP 代碼。

          ● 只在 Master 啟動(dòng)時(shí)執(zhí)行一遍 PHP 初始化代碼,Master 進(jìn)入監(jiān)聽狀態(tài),并不會(huì)結(jié)束進(jìn)程。

          ● 不僅可以用于 HTTP Server,還可以建立 TCP 連接、WebSocket 連接。

          以上主要針對(duì)核心運(yùn)行機(jī)制作對(duì)比,列舉的不同,暫時(shí)就想到這幾點(diǎn)了,如果有漏掉的重點(diǎn),歡迎大家?guī)臀已a(bǔ)充啦~

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)